Открой любой сайт с блогом, интернет-магазин на готовом движке или форум из нулевых. С большой вероятностью статьи, заказы и сообщения там лежат в 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 и разберём, что он печатает.
домашка