MySQL и MariaDB
| Тип | реляционная СУБД |
|---|---|
| MySQL — первый выпуск | 1995 (MySQL AB, Швеция) |
| MySQL — владелец | Oracle (с 2010) |
| MariaDB — форк | 2009, Майкл Видениус |
| Основной движок | InnoDB (транзакции, MVCC, внешние ключи) |
| Лицензия | GPL v2 (+ коммерческая у MySQL) |
| Порт по умолчанию | 3306 |
MySQL — открытая реляционная СУБД, одна из самых распространённых в мире, исторически — основа веба: буква «M» в стеке LAMP (Linux, Apache, MySQL, PHP). MariaDB — её форк, созданный в 2009 году основателем MySQL Майклом Видениусом после покупки Sun компанией Oracle. На MySQL построены WordPress, Drupal, ранние Facebook, YouTube, Twitter, а сегодня — крупнейшие сервисы через шардирующие надстройки вроде Vitess.[1][7]
История
MySQL создали в 1995 году шведская компания MySQL AB — Майкл Видениус, Давид Аксмарк и Аллан Ларссон. Название — по имени дочери Видениуса My (а MariaDB — по имени младшей дочери, Марии). Ранние версии были быстрыми, но упрощёнными: таблицы MyISAM не поддерживали транзакции и внешние ключи. Ситуацию изменил движок InnoDB, ставший основным в версии 5.5 (2010).
В 2008 году MySQL AB купила Sun Microsystems, а в 2010-м Sun поглотила Oracle. Опасаясь за будущее проекта, Видениус основал MariaDB, а Percona выпускает собственную сборку Percona Server. С 2023 года у MySQL модель с LTS-выпусками (8.4, затем 9.7) и промежуточными «Innovation»-версиями.[3]
Архитектура
Особенность MySQL — подключаемые движки хранения: SQL-слой (разбор, оптимизация) отделён от слоя, хранящего данные.
- InnoDB — движок по умолчанию: ACID-транзакции, построчные блокировки, MVCC, внешние ключи, восстановление после сбоя. Таблицы хранятся как кластерный индекс по первичному ключу (B+-дерево): строки физически упорядочены по ключу, а вторичные индексы ссылаются на первичный ключ.[5]
- MyISAM — устаревший нетранзакционный движок.
- В MariaDB дополнительно Aria, ColumnStore (колоночный, см. Колоночное хранение), Spider (шардирование).
Из кластерного индекса вытекает практический совет: первичный ключ должен быть коротким и монотонным (автоинкремент или UUIDv7), иначе вставки фрагментируют таблицу.
MySQL и MariaDB сегодня
Изначально MariaDB был совместимой заменой «один в один», но к 2020-м годам ветки разошлись:[4]
| MySQL (Oracle) | MariaDB | |
|---|---|---|
| Развитие | Oracle, часть функций — в коммерческой Enterprise | MariaDB Foundation и MariaDB plc, открытое |
| JSON | бинарный тип JSON |
JSON — псевдоним LONGTEXT с проверкой |
| Репликация | GTID MySQL, Group Replication, InnoDB Cluster | свой формат GTID, Galera Cluster |
| Особенности | оконные функции, CTE, EXPLAIN ANALYZE |
системно-версионированные таблицы, последовательности, векторный тип (11.7+) |
| Дистрибутивы Linux | Ubuntu, Oracle Linux | по умолчанию в Debian, RHEL, Fedora, Arch |
Переход между ними на новых версиях уже не гарантированно бесшовен — особенно с бинарными данными репликации и JSON.
Быстрый старт
docker run -d --name db -e MARIADB_ROOT_PASSWORD=secret -p 3306:3306 mariadb:11
mysql -h 127.0.0.1 -u root -p
CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE orders (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
total DECIMAL(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id)
) ENGINE=InnoDB;
Ловушка из прошлого: кодировка utf8 в MySQL — на самом деле трёхбайтовая utf8mb3, она не вмещает эмодзи и часть символов Unicode. Всегда используйте utf8mb4 (по умолчанию с MySQL 8.0). Другая ловушка — нестрогий режим SQL в старых версиях, при котором неверные значения молча обрезались; сейчас STRICT_TRANS_TABLES включён по умолчанию.
Репликация и масштабирование
MySQL давно славится простой репликацией: основной сервер пишет бинарный журнал (binlog), реплики его применяют. Варианты — асинхронная, полусинхронная, Group Replication с автоматическим выбором лидера. Binlog также служит источником для захвата изменений (CDC) через Debezium. Для шардирования используют Vitess (разработан в YouTube, применяется в Slack, GitHub, Shopify) и прокси ProxySQL.
MySQL или PostgreSQL
Обе СУБД зрелые и подходят для большинства задач. PostgreSQL богаче по возможностям SQL (типы, расширения вроде PostGIS и pgvector, частичные индексы, транзакционный DDL) и строже к стандарту; поэтому в новых проектах в 2020-х его выбирают чаще. MySQL проще в эксплуатации репликации, имеет огромную базу установок, хостинга и специалистов, хорошо проверен на очень высоких нагрузках чтения. По рейтингу DB-Engines MySQL остаётся второй по популярности СУБД после Oracle.[6]
Инструменты
mysqldump/mariadb-dump— логические бэкапы; Percona XtraBackup и Mariabackup — горячие физические (см. Бэкапы: правило 3-2-1);- MySQL Shell, MySQL Workbench, DBeaver — клиенты;
pt-online-schema-change, gh-ost — изменение больших таблиц без блокировок (см. Миграции схемы БД);- драйверы: PyMySQL и mysqlclient (Python), go-sql-driver/mysql,
mysql2(Node.js).