Раздел 34 · MySQL с нуля

Что такое MySQL и где он применяется

junior~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Открой любой сайт с блогом, интернет-магазин на готовом движке или форум из нулевых. С большой вероятностью статьи, заказы и сообщения там лежат в MySQL. Это одна из самых распространённых баз данных в мире, и в этом разделе мы пройдём её от установки до репликации. Если ты пришёл из теории баз данных, здесь те же таблицы и ключи, только в живой программе.

Первый урок отвечает на три вопроса: что это за программа, где она работает и чем отличается от соседей по курсу.

Касса и зал

Представь кинотеатр. Зрители не заходят в кассовую комнату и не пишут сами в журнал проданных мест. Они подходят к окошку и говорят: «Два билета на вечерний сеанс, ряд А». Кассир смотрит в журнал, проверяет, что места свободны, записывает покупку и выдаёт билеты. Если к двум окошкам одновременно подошли двое и оба хотят место A1, кассиры договорятся: место получит кто-то один.

MySQL устроен так же. Данные лежат в файлах на диске, но твоя программа никогда не трогает эти файлы. Она отправляет запрос на SQL, а отдельная программа-сервер читает и меняет файлы и отвечает. Такая схема называется клиент-серверной.

  сайт на PHP или Node.js ─┐
  клиент mysql в терминале ┼──── запросы SQL ────▶  сервер mysqld ──▶ файлы на диске
  программа DBeaver ───────┘◀──── результаты ─────

В MySQL у этих ролей есть точные имена:

  • mysqld это сервер. Буква d на конце значит демон: программа работает в фоне, без окна, и ждёт подключений. По умолчанию она слушает порт 3306.
  • mysql это консольный клиент. Ты набираешь в нём запрос, он отправляет его серверу и печатает ответ табличкой.

Когда сервер готов, он пишет в свой журнал строку вроде такой. Её выдал настоящий сервер из официального образа:

[System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.4.13'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

Здесь видно всё, что нужно клиенту: версия 8.4.13, порт 3306 и сокет, через который подключаются клиенты на этой же машине.

Клиентов много, сервер один. Сотни подключений одновременно читают и пишут одни и те же таблицы, и сервер следит, чтобы они не испортили данные друг другу. Как кассиры, которые не продают одно место дважды.

Откуда он взялся

  • 1995. Шведская компания MySQL AB выпускает первую версию. Один из основателей, Монти Видениус, назвал базу в честь дочери Му (My).
  • 2008. MySQL AB покупает Sun Microsystems, а в 2010-м Sun вместе с MySQL переходит к Oracle. С тех пор MySQL развивает Oracle.
  • 2009. Видениус делает форк MySQL под именем MariaDB, назвав его в честь младшей дочери. MariaDB долго оставалась почти полной копией MySQL, но сейчас они разошлись. В курсе мы работаем с MySQL.

Бесплатная версия называется MySQL Community Server, её код открыт под лицензией GPL. Это слова MySQL Community Server - GPL в строке из журнала выше.

Какую версию ставить

У MySQL два вида выпусков:

  • LTS, выпуски с долгой поддержкой. В них годами выходят только исправления, поведение не меняется. Текущий такой выпуск 8.4, он вышел в апреле 2024 года.
  • Innovation, промежуточные выпуски 9.x. В них появляются новые возможности, но каждый поддерживается лишь до следующего.

Для работы и для учёбы бери LTS. Весь раздел написан под MySQL 8.4, а песочница в уроках повторяет его ответы символ в символ. Старая ветка 8.0 ещё встречается на серверах, её поддержка закончилась в апреле 2026 года.

Где он работает

MySQL много лет входил в связку LAMP: Linux, веб-сервер Apache, MySQL и язык PHP. На этой связке выросли WordPress, Drupal, phpBB и тысячи интернет-магазинов. WordPress и сегодня требует MySQL или MariaDB.

Крупные компании тоже держат на нём огромные объёмы. GitHub хранит в MySQL данные о репозиториях и пользователях, Booking.com и Facebook годами строили на нём свои системы. Облачные платформы продают MySQL готовой услугой: ты получаешь адрес и пароль, а сервер обслуживают за тебя.

Чем он отличается от соседей

В курсе есть ещё две реляционные базы, и ты наверняка спросишь, зачем третья.

  • PostgreSQL тоже сервер, тоже SQL, и про него есть свой раздел. Он строже относится к типам и стандарту SQL и богаче возможностями: массивы, свои типы, расширения. MySQL проще в настройке и давно славится скоростью на простых чтениях. На практике обе базы закрывают одни и те же задачи, а выбор часто решает то, что уже стоит в компании.
  • SQLite вообще не сервер. Это библиотека внутри твоей программы, и вся база лежит в одном файле. Кассира нет, зритель сам пишет в журнал. Для телефона или настольной программы этого хватает, для сайта с тысячами покупателей нет. Про неё отдельный раздел.

Мелкие различия в SQL у трёх баз тоже есть, и мы будем отмечать их по ходу. Например, MySQL по умолчанию сравнивает строки без учёта регистра: 'Брат' и 'БРАТ' для него одно и то же. Подробно это разберём в уроке про строки.

Учебная база: кинотеатр

Во всех уроках раздела в песочнице уже есть база kino. Это наш кинотеатр, а в нём пять таблиц:

ТаблицаЧто хранит
hallsзалы: Большой, Малый и VIP с числом мест
filmsфильмы: название, режиссёр, год, длительность, возрастной рейтинг
viewersзрители: имя, почта, телефон, город
screeningsсеансы: какой фильм, в каком зале, когда и почём
ticketsбилеты: на какой сеанс, кто купил, какое место, в каком статусе

Сервер в песочнице уже запущен. Спросим у него версию:

SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.4.13    |
+-----------+
1 row in set (0.00 sec)

Каждый ответ клиент заканчивает строкой о том, сколько строк вернулось и за сколько секунд. Теперь посмотрим, какие таблицы есть в базе:

SHOW TABLES;
+----------------+
| Tables_in_kino |
+----------------+
| films          |
| halls          |
| screenings     |
| tickets        |
| viewers        |
+----------------+
5 rows in set (0.00 sec)

И выведем фильмы:

SELECT title, director, release_year FROM films;
+-------------------------------------------+----------------------+--------------+
| title                                     | director             | release_year |
+-------------------------------------------+----------------------+--------------+
| Брат                                      | Балабанов            |         1997 |
| Москва слезам не верит                    | Меньшов              |         1979 |
| Ирония судьбы                             | Рязанов              |         1975 |
| Сталкер                                   | Тарковский           |         1979 |
| Ёжик в тумане                             | Норштейн             |         1975 |
| Новые имена                               | NULL                 |         2026 |
| Солярис                                   | Тарковский           |         1972 |
+-------------------------------------------+----------------------+--------------+
7 rows in set (0.00 sec)

Две вещи бросаются в глаза. Колонки с русским текстом слишком широкие: клиент считает ширину в байтах, а русская буква занимает два байта. Так выглядит настоящий клиент mysql, привыкай. И у фильма «Новые имена» вместо режиссёра стоит NULL: режиссёр неизвестен. Что такое NULL и почему с ним надо быть осторожным, разобрано в теории про NULL.

В данных нарочно есть и другие неудобные места: фильм без сеансов, сеанс без проданных билетов, зрители без телефона, билеты из кассы без зрителя. Они пригодятся, когда дойдём до запросов. Полный скрипт базы мы покажем в уроке про SELECT.

Что запомнить

  • MySQL работает как сервер mysqld: программы присылают ему запросы, а с файлами базы он работает сам.
  • Консольный клиент mysql отправляет запрос и печатает ответ табличкой, по умолчанию сервер слушает порт 3306.
  • Для проектов бери выпуск LTS 8.4: в нём годами выходят только исправления.
  • PostgreSQL тоже сервер, а SQLite живёт внутри программы и хранит базу в одном файле.
  • В песочнице уже есть база kino из пяти таблиц, и в ней нарочно есть пропуски вроде NULL у режиссёра.

Попробуй сам

Замени films в последнем запросе на halls: сколько мест в VIP-зале? Потом выполни SELECT COUNT(*) FROM tickets; и узнай, сколько билетов уже продано. Попробуй SHOW DATABASES;: кроме kino, сервер покажет свои служебные базы.

Проверь себя

Задание

Дальше

В песочнице сервер уже запущен за тебя. В следующем уроке поднимем свой MySQL 8.4 в Docker, подключимся к нему клиентом mysql и разберём, что он печатает.

домашка

Домашка