База данных MySQL: полный обзор, плюсы, минусы и пределы
Для чего нужна база данных MySQL, где она лучший выбор, а где выигрывает другая: плюсы и минусы, версии 8.4 и 9, сравнение с PostgreSQL, MariaDB и SQLite, инструменты, примеры SQL, пределы и советы.
Коротко
MySQL — бесплатная реляционная база данных, которой владеет Oracle, и самая распространённая база веба: на ней работают WordPress, 1С-Битрикс, большинство CMS и платформ магазинов, а ещё GitHub, Shopify и Booking.com. Сильные стороны — простота эксплуатации, дешёвые подключения, очень зрелая репликация и наличие на любом хостинге, включая самый дешёвый. MySQL 8 догнала современный SQL: оконные функции, CTE, JSON, ограничения CHECK, мгновенные изменения схемы. Слабые места по сравнению с PostgreSQL — меньше типов данных и расширений, нет RETURNING, а изменение схемы само фиксирует транзакцию. Поддержка версии 8.0 закончилась в апреле 2026 года — долгосрочная версия теперь 8.4.
MySQL коротко: паспорт базы
Главные факты одной таблицей: откуда база взялась, как она хранит данные и как развивается.
- Тип
- Реляционная система управления базами данных с открытым кодом
- История
- MySQL AB, Швеция, 1995 год; Sun — с 2008-го; Oracle — с 2010-го
- Лицензия
- Редакция Community — по GPL v2; Oracle также продаёт Enterprise и коммерческую лицензию
- Движок хранения
- InnoDB по умолчанию с 2010 года: транзакции, блокировки строк, кластерный первичный ключ
- Транзакции
- ACID и MVCC через журнал отката — вакуум не нужен
- SQL
- С 8.0: оконные функции, CTE, функции JSON,
CHECK,EXPLAIN ANALYZE - Индексы
- B-tree, полнотекстовые, пространственные; по выражению, убывающие, невидимые
- Репликация
- Асинхронная и полусинхронная; Group Replication и InnoDB Cluster
- Версии
- 8.4 — долгосрочная версия; 9.x — инновационные выпуски; поддержка 8.0 закончилась в апреле 2026-го
- Ответвления
- MariaDB (от автора MySQL) и Percona Server
- На ней работают
- WordPress, 1С-Битрикс, GitHub, Shopify, Booking.com
Для чего применяется MySQL: 8 сфер
MySQL выросла вместе с вебом и сильнее всего именно там. Под каждой сферой — инструменты, с которыми она обычно идёт.
-
01
Сайты на CMS
Самые популярные CMS сделаны под MySQL и её ответвления.
-
02
Интернет-магазины
Заказы, остатки и покупатели на готовых платформах и своём коде.
-
03
Веб-приложения
Классический бэкенд на PHP, Ruby, Python и Go.
-
04
Много простых чтений
Выборки по ключу в большом объёме — с репликами на чтение.
-
05
Огромный горизонтальный масштаб
Шардинг через Vitess — систему, выросшую в YouTube.
-
06
Отказоустойчивость
Автоматическое переключение на реплику, когда главный сервер падает.
-
07
Виртуальный хостинг
База на любом тарифе хостинга без отдельного администрирования.
-
08
Управляемые базы в облаке
Каждое крупное облако даёт MySQL с резервными копиями и репликами из коробки.
Плюсы и минусы MySQL
MySQL делает ставку на простоту и скорость повседневных операций. Отсюда большинство её сильных сторон и ограничений.
Плюсы · 8
-
Простая в эксплуатации
Разумные настройки по умолчанию, без вакуума, предсказуемая жизнь на скромном железе.
-
Дешёвые подключения
Поток на подключение: сотни веб-процессов без пулера.
-
Зрелая репликация
Реплики на чтение настраиваются быстро; Group Replication и InnoDB Cluster дают переключение при сбое.
-
Есть везде
На любом хостинге и в любом облаке — вопрос «а поддерживается ли?» не стоит.
-
Экосистема веба
Большинство CMS и платформ магазинов, инструментов администрирования и панелей хостинга построены вокруг неё.
-
Современный SQL в 8.x
Оконные функции, CTE, JSON и ограничения
CHECKзакрыли старые пробелы. -
Изменения схемы на ходу
ALGORITHM=INSTANTдобавляет колонку без перезаписи таблицы, остальное делает gh-ost. -
Масштаб, проверенный гигантами
На ней работают GitHub, Shopify и Booking.com, а Vitess шардирует её горизонтально.
Минусы · 8
-
Владелец — Oracle
Развитие определяет одна компания; часть возможностей есть только в платных редакциях и облаке.
-
Нет изменения схемы в транзакции
Каждая команда атомарна, но
ALTER TABLEфиксирует транзакцию — неудачная миграция не откатывается. -
Нет RETURNING
Вставленную строку приходится читать вторым запросом.
-
Меньше типов и расширений
Нет массивов, диапазонов и своих типов; ничего похожего на PostGIS или pgvector в открытой редакции.
-
Нет частичных индексов
Индекс всегда покрывает всю таблицу, даже если запросам нужна её малая часть.
-
Мягкие старые настройки
Старые установки могут молча обрезать строки и принимать неверные даты.
-
Ответвления расходятся
MariaDB уже не замена один к одному: JSON и репликация работают иначе.
-
Строчное хранение для аналитики
Проход по миллиардам строк для отчётов — задача колоночных баз.
MySQL и другие базы: сравнение с PostgreSQL, MariaDB и SQLite
Качественное сравнение с базами, с которыми MySQL выбирают чаще всего.
| Критерий | MySQL | PostgreSQL | MariaDB | SQLite |
|---|---|---|---|---|
| Владелец | Oracle | сообщество | MariaDB Foundation и компания | общественное достояние |
| Сервер | да | да | да | нет, файл |
| Простота эксплуатации | высокая | средняя | высокая | самая высокая |
| SQL и типы | современная база | самые богатые | близко к MySQL, свои добавки | базовые |
| Изменение схемы в транзакции | нет | да | нет | да |
| Репликация | очень зрелая | зрелая | зрелая, Galera | встроенной нет |
| Хостинг | везде | VPS и облака | часто вместо MySQL | где угодно, это файл |
| Лучше всего для | CMS, магазинов, веб-приложений | сервисов, SaaS, сложных данных | CMS на хостинге | небольших сайтов и приложений |
Когда брать MySQL, а когда нет
Двенадцать типичных задач с вердиктом. Где MySQL не лучший выбор, названа альтернатива.
-
Сайт на WordPress или другой CMS
Лучший выборCMS сделана под неё.
-
Магазин на готовой платформе
Лучший выборБольшинство платформ ждут MySQL.
-
Веб-приложение с простыми данными
Лучший выборНадёжно, быстро и просто в эксплуатации.
-
Виртуальный хостинг
Лучший выборОна есть на любом тарифе.
-
Много чтений с репликами
Лучший выборРепликация — сильная сторона MySQL.
-
Команда с опытом MySQL
Лучший выборОпыт важнее небольших различий.
-
Много данных в JSON
ПодходитРаботает через вычисляемые колонки; PostgreSQL с jsonb удобнее.
-
Поиск по сайту
ПодходитВстроенного полнотекстового поиска хватает для простых случаев; дальше — Meilisearch.
-
Геоданные и карты
Другой языкPostgreSQL с PostGIS.
-
ИИ-поиск по векторам
Другой языкPostgreSQL с pgvector: индексы в открытой версии.
-
Сложная предметная область со строгими правилами
Другой языкPostgreSQL: богаче типы, миграции в транзакции.
-
Аналитика по миллиардам событий
Другой языкClickHouse: колоночное хранение.
Экосистема MySQL: инструменты для частых задач
Средняя колонка — то, что идёт вместе с самой MySQL.
| Задача | Встроено | Инструменты |
|---|---|---|
| Резервные копии | mysqldump, MySQL Shell | Percona XtraBackup |
| Изменение схемы на ходу | ALGORITHM=INSTANT | gh-ost, pt-online-schema-change |
| Маршрутизация подключений | MySQL Router | ProxySQL |
| Отказоустойчивость | Group Replication, InnoDB Cluster | Orchestrator |
| Шардинг | — | Vitess, PlanetScale |
| Медленные запросы | slow query log, EXPLAIN ANALYZE | pt-query-digest |
| Мониторинг | Performance Schema, sys | PMM, mysqld_exporter |
| Администрирование | mysql, MySQL Shell | phpMyAdmin, Adminer, DBeaver |
| Миграции | — | Flyway, Liquibase, Atlas |
Пределы MySQL: где она упирается
-
Неудачная миграция
Изменения схемы не откатываются вместе с транзакцией — наполовину применённую миграцию чинят руками.
-
Большой ALTER на нагруженной таблице
Не каждое изменение мгновенное; для остальных — gh-ost, чтобы сайт не вставал.
-
Случайные первичные ключи
InnoDB хранит строки в порядке ключа; случайные UUID разбрасывают вставки и раздувают таблицу.
-
Аналитика в основной базе
Тяжёлые отчёты тормозят сайт; им место на реплике или в колоночной базе.
-
Данные сложнее таблиц
Геоданные, векторы и сложные типы подталкивают проект к PostgreSQL.
-
Остаться на 8.0
После апреля 2026 года она не получает исправлений безопасности — переход на 8.4 нужно планировать.
8 советов, как работать с MySQL
-
01
utf8mb4 везде
Старая
utf8не хранит эмодзи и часть символов;utf8mb4— настоящая UTF-8. -
02
Строгий режим включён
Неверные данные должны быть ошибкой, а не молча обрезанными значениями.
-
03
Короткие растущие первичные ключи
BIGINT AUTO_INCREMENTили UUID, упорядоченные по времени, — не случайные. -
04
Журнал медленных запросов
Он показывает, что оптимизировать; pt-query-digest собирает его в отчёт.
-
05
EXPLAIN ANALYZE перед индексом
Смотрите настоящий план, а индекс перед удалением сначала прячьте.
-
06
Горячие резервные копии
XtraBackup копирует работающую базу без остановки; восстановление проверяйте регулярно.
-
07
Отчёты — на реплике
Тяжёлое чтение не спорит с сайтом за главный сервер.
-
08
Спланируйте переход на 8.4
Проверьте удалённые настройки и плагины на копии, прежде чем обновлять рабочую базу.
Как выглядит MySQL: 3 примера SQL
Отчёт с оконной функцией, изменение схемы без остановки и чтение плана запроса. Проверены на MySQL 8.4.
Отчёт с оконной функцией
Два лучших товара в каждой категории одним запросом — то, что раньше писали циклами в коде.
-- два лучших товара по выручке в каждой категории: CTE и оконная функция
CREATE TABLE sales (
product VARCHAR(40) NOT NULL,
category VARCHAR(20) NOT NULL,
revenue DECIMAL(10,2) NOT NULL CHECK (revenue >= 0)
);
INSERT INTO sales VALUES
('Дубовый стол', 'столы', 120000), ('Сосновый стол', 'столы', 45000), ('Стеклянный стол', 'столы', 80000),
('Дубовый стул', 'стулья', 30000), ('Барный стул', 'стулья', 52000);
WITH ranked AS (
SELECT product, category, revenue,
RANK() OVER (PARTITION BY category ORDER BY revenue DESC) AS place
FROM sales
)
SELECT category, product, revenue
FROM ranked
WHERE place <= 2
ORDER BY category, place;
-- столы | Дубовый стол | 120000.00
-- столы | Стеклянный стол | 80000.00
-- стулья | Барный стул | 52000.00
-- стулья | Дубовый стул | 30000.00
Изменение схемы без остановки
Мгновенная новая колонка и невидимый индекс — безопасный способ проверить, нужен ли ещё индекс.
CREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(190) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX orders_email_idx (email)
);
-- новая колонка без перезаписи таблицы: мгновенно даже на миллионах строк
ALTER TABLE orders ADD COLUMN source VARCHAR(30) NULL, ALGORITHM=INSTANT;
-- перед удалением индекс прячут: если запросы замедлятся, его возвращают
ALTER TABLE orders ALTER INDEX orders_email_idx INVISIBLE;
ALTER TABLE orders ALTER INDEX orders_email_idx VISIBLE;
SELECT index_name, is_visible FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'orders' AND index_name = 'orders_email_idx';
-- orders_email_idx | YES
Чтение плана запроса
EXPLAIN ANALYZE показывает, что запрос идёт по индексу, а не читает всю таблицу.
-- EXPLAIN ANALYZE выполняет запрос и показывает, куда ушло время
INSERT INTO orders (email) VALUES ('[email protected]'), ('[email protected]'), ('[email protected]');
EXPLAIN ANALYZE
SELECT id, created_at FROM orders WHERE email = '[email protected]';
-- -> Index lookup on orders using orders_email_idx (email='[email protected]')
Вопросы о MySQL
MySQL бесплатная?
Редакция Community бесплатна по GPL v2. Oracle дополнительно продаёт Enterprise с инструментами и поддержкой.
Какую версию использовать?
8.4, долгосрочную. Поддержка 8.0 закончилась в апреле 2026 года.
MySQL или MariaDB?
Для CMS на хостинге подойдёт любая. Они разошлись, поэтому проекту, написанному под одну, могут понадобиться правки под другую.
MySQL или PostgreSQL?
MySQL — для CMS, виртуального хостинга и простых данных; PostgreSQL — для сложных данных, сервисов и ИИ-поиска.
Выдержит ли MySQL высокую нагрузку?
Да: на ней работают GitHub и Shopify, реплики масштабируют чтение, а Vitess — запись по горизонтали.
Поддерживает ли MySQL JSON?
Да, тип JSON с функциями; поля индексируют через вычисляемые колонки.
Почему эмодзи сохраняются вопросительными знаками?
В таблице старая кодировка utf8; переходите на utf8mb4.
Как сделать копию MySQL, не останавливая сайт?
Percona XtraBackup или выгрузки MySQL Shell копируют работающую базу; восстановление копии проверяйте.
Форма
Базы данных
на MySQL
Работаю с MySQL в своих проектах: проектирую схему, ускоряю медленные запросы, настраиваю индексы, репликацию и резервные копии, переношу данные между MySQL и PostgreSQL. Расскажите о задаче — отвечу в течение рабочего дня.