MySQL и MariaDB

Материал из llmdocs — справочник разработчика
Портал: Базы данных
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).

См. также

Источники

  1. MySQL 8.4 Reference Manual
  2. MariaDB Documentation
  3. MySQL — Release model (LTS and Innovation)
  4. MariaDB versus MySQL: Compatibility
  5. MySQL — The InnoDB Storage Engine
  6. DB-Engines Ranking
  7. Vitess — scalable MySQL clustering