Databases

MySQL / MariaDB

MySQL — самая распространённая открытая реляционная СУБД и основа LAMP-стека, MariaDB — её форк, созданный после покупки MySQL компанией Oracle.

Что такое MySQL

MySQL — свободная реляционная СУБД, одна из самых распространённых в вебе. Появилась в 1995 году, стала стандартной базой LAMP/LEMP-стека и работает под большинством массовых CMS — WordPress, Bitrix, Drupal, Magento. Название читают «май-эс-кью-эль», написания «my sql» и «mysql» означают одно и то же.

Причина популярности историческая и практическая: MySQL прост в установке, нетребователен к ресурсам, есть на любом хостинге и хорошо документирован. Под типовую веб-нагрузку — много простых чтений — его достаточно.

MySQL и MariaDB

MariaDB — форк MySQL, начатый в 2009 году Микаэлем Видениусом, одним из создателей MySQL, после того как компания Sun (владевшая MySQL) была куплена Oracle. Мотив — опасение, что открытая версия будет развиваться в интересах проприетарного продукта. Название дано по имени дочери основателя.

MySQL MariaDB
Владелец Oracle MariaDB Foundation
Лицензия GPL + коммерческая GPL
Community-версия Часть возможностей — только в Enterprise Всё открыто
Движки InnoDB InnoDB, Aria, ColumnStore
Совместимость На уровне протокола и SQL, с расхождениями

На практике: для типового приложения они взаимозаменяемы, драйверы и клиенты работают с обеими. Расхождение версий накопилось — MariaDB давно не «просто MySQL с другим шильдиком», и совместимость в обратную сторону (перенести с MariaDB на MySQL) хуже, чем в прямую. В большинстве дистрибутивов Linux MariaDB стоит по умолчанию вместо MySQL.

Движки: InnoDB против MyISAM

Особенность MySQL — сменные движки хранения на уровне таблицы. Исторически это источник проблем в старых проектах:

InnoDB MyISAM
Транзакции Есть Нет
Внешние ключи Есть Игнорируются
Блокировки Строк Всей таблицы
Восстановление после сбоя Через журнал Ручной REPAIR TABLE

InnoDB — движок по умолчанию начиная с MySQL 5.5, и правильный ответ почти всегда «InnoDB». MyISAM встречается в унаследованных базах: он молча игнорирует FOREIGN KEY, не даёт транзакций и блокирует таблицу целиком на запись. Проверить и исправить:

SELECT table_name, engine FROM information_schema.tables
WHERE table_schema = 'shop' AND engine <> 'InnoDB';

ALTER TABLE legacy_orders ENGINE = InnoDB;

Начало работы

sudo apt install mariadb-server
sudo mysql_secure_installation      # снять анонимный доступ, задать пароль root

mysql -u root -p
CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON shop.* TO 'app'@'localhost';
FLUSH PRIVILEGES;

Кодировка — обязательно utf8mb4, а не utf8. Историческая ловушка MySQL: его utf8 хранит максимум 3 байта на символ и не вмещает эмодзи и часть символов — при вставке они превращаются в мусор или вызывают ошибку. Настоящий UTF-8 в MySQL называется utf8mb4.

Базовый тюнинг

# /etc/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 8G        # ~60-70% RAM на выделенном сервере
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1  # надёжно; 2 быстрее, но теряет ~1 с при сбое
max_connections = 200
slow_query_log = 1
long_query_time = 1                 # логировать запросы дольше 1 секунды

innodb_buffer_pool_size — главная ручка: это кеш данных и индексов в памяти. Значение по умолчанию (128 МБ) не подходит ни одному боевому серверу — если рабочий набор помещается в буферный пул, диск почти не читается.

Диагностика

EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- type: ALL  → полный скан таблицы, нужен индекс
-- type: ref  → индекс используется

SHOW ENGINE INNODB STATUS\G     -- блокировки, дедлоки
SHOW PROCESSLIST;               -- что выполняется прямо сейчас

MySQL Workbench

MySQL Workbench — официальный бесплатный GUI-клиент от Oracle для Windows, macOS и Linux. Умеет визуальный редактор запросов с подсветкой, ER-диаграммы и проектирование схемы, forward/reverse engineering (схема из диаграммы и наоборот), администрирование пользователей и мониторинг, импорт-экспорт дампов.

Альтернативы: phpMyAdmin — веб-интерфейс, стандарт на shared-хостинге; DBeaver — универсальный клиент под все СУБД сразу.

Масштабирование

Стандартный путь роста: репликация primary → реплики через binlog, чтение с реплик, а при исчерпании возможностей одного сервера — шардирование (Vitess, ProxySQL). Кластерные решения — Galera Cluster (синхронная мультимастер-репликация, в MariaDB из коробки) и MySQL Group Replication / InnoDB Cluster.

Связанные термины

  • СУБД — класс, к которому относится MySQL
  • SQL — язык запросов
  • PostgreSQL — основной конкурент среди открытых СУБД
  • phpMyAdmin — веб-интерфейс управления MySQL
  • LEMP-стек — связка, где MySQL традиционно выступает базой
  • Дамп базы данныхmysqldump и восстановление

Готовы запустить GPU-задачу?

Запустить GPU-сервер