Производительность: полное руководство по MySQL за 30 минут

Сжатое практическое руководство по диагностике и увеличению производительности MySQL, разбитое на этапы: диагностика, оптимизация запросов, настройка сервера и мониторинг.
Производительность MySQL — это не магия, а следствие понимания внутренних механизмов и системного подхода к настройке. Когда приложение начинает тормозить, база данных часто оказывается главным подозреваемым. Это руководство за 30 минут даст вам структурированный план диагностики и оптимизации.

Минуты 1-5: Быстрая диагностика (Где болит?). Не начинайте со слепой настройки конфига. Соберите метрики.
  • Подключитесь к серверу и выполните `SHOW GLOBAL STATUS LIKE 'Threads_connected';` — сколько активных подключений. Высокое значение может указывать на проблемы с пуллингом соединений в приложении.
  • Проверьте нагрузку на диски: `SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';` и `SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';`. Рассчитайте hit ratio: `(1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100`. Значение ниже 99% часто говорит о нехватке оперативной памяти для буферного пула.
  • Выявите медленные запросы. Убедитесь, что включен slow query log (`slow_query_log = ON`, `long_query_time = 2`). Или используйте `SELECT * FROM information_schema.processlist WHERE TIME > 10 AND COMMAND != 'Sleep';` для поиска "висящих" запросов прямо сейчас.
Минуты 6-15: Оптимизация запросов и индексов (Главный рычаг). 80% проблем решается здесь.
  • Используйте `EXPLAIN` (или `EXPLAIN ANALYZE` в MySQL 8.0.18+) для каждого медленного запроса. Смотрите на ключевые колонки:
* `type`: Должно быть `eq_ref`, `ref`, `range`. Избегайте `ALL` (полное сканирование таблицы) и `index` (полное сканирование индекса).  *  `key`: Используется ли индекс?
 *  `rows`: Оценочное количество проверяемых строк. Чем меньше, тем лучше.
 *  `Extra`: Опасайтесь `Using filesort` (сортировка на диске) и `Using temporary` (создание временной таблицы).
  • Создавайте правильные индексы. Индекс должен покрывать столбцы из `WHERE`, `ORDER BY`, `JOIN`. Используйте составные индексы, учитывая порядок колонок. Пример: для `WHERE a = 5 AND b > 10 ORDER BY c` хорошим кандидатом будет индекс `(a, b, c)`. Удаляйте неиспользуемые индексы (`sys.schema_unused_indexes`).
  • Перепишите запросы. Избегайте `SELECT *`, выбирайте только нужные столбцы. Осторожно с `JOIN` на большие таблицы, проверяйте наличие индексов по полям соединения. Кэшируйте результаты тяжелых агрегирующих запросов на уровне приложения или используйте материализованные представления.
Минуты 16-23: Настройка сервера (Тонкая настройка двигателя). Теперь можно трогать `my.cnf`.
  • **InnoDB Buffer Pool (`innodb_buffer_pool_size`)** — самый важный параметр. Установите его в ~70-80% от доступной RAM на выделенном сервере. Для мониторинга используйте `SHOW ENGINE INNODB STATUS\G`, секция `BUFFER POOL AND MEMORY`.
  • **Логирование и надежность.** Для продакшена с важными данными: `innodb_flush_log_at_trx_commit = 1` (полная устойчивость, медленнее) и `sync_binlog = 1`. Для лучшей производительности при готовности к потере последней секунды данных можно использовать `innodb_flush_log_at_trx_commit = 2`.
  • **Соединения.** `max_connections` — установите адекватное значение (например, 300-500), но помните, что каждое соединение потребляет память. Используйте пул соединений в приложении.
  • **Кэш запросов.** В MySQL 8.0 кэш запросов отключен по умолчанию, и часто его лучше не включать. Для частых одинаковых `SELECT` используйте кэш приложения.
Минуты 24-28: Мониторинг и обслуживание (Поддержание здоровья).
  • Регулярно анализируйте slow log с помощью `pt-query-digest` из Percona Toolkit. Это покажет вам "самых злостных нарушителей".
  • Настройте мониторинг ключевых метрик: скорость запросов (QPS), загрузка CPU, использование оперативной памяти, I/O дисков, размер репликационного лага.
  • Проводите регулярное обслуживание: `OPTIMIZE TABLE` для сильно фрагментированных таблиц (осторожно, блокирует таблицу), очистка старых бинарных логов.
  • Рассмотрите архитектурные улучшения: репликация чтения (read replicas) для распределения нагрузки, шардинг для очень больших таблиц.
Минуты 29-30: Действуйте! Составьте план:
  • Включите slow query log, если он выключен.
  • Найдите 1-2 самых медленных запроса с помощью `pt-query-digest`.
  • Проанализируйте их через `EXPLAIN`.
  • Создайте недостающий индекс или перепишите запрос.
  • Измерьте улучшение.
Помните, что оптимизация — итеративный процесс. Начните с запросов, затем переходите к настройкам сервера, и всегда измеряйте результат каждого изменения в реалистичных условиях.
187 2

Комментарии (14)

avatar
d8s30y6xh 01.04.2026
Спасибо за конкретику! Особенно про Threads_connected и медленные запросы. Беру на вооружение.
avatar
whh9bg6r2 02.04.2026
SHOW PROCESSLIST — это первое, что нужно делать при проблемах, согласен. Важный пункт.
avatar
symn8i5pfp 02.04.2026
Для маленьких проектов такая детальная настройка — overkill. Часто хватает индексов и кэша.
avatar
dbpg9rvx 02.04.2026
Автор молодец, что акцентирует на мониторинге. Постоянный сбор метрик — залог стабильности.
avatar
wyg3qgl8b 03.04.2026
Отличная структура! Особенно ценно, что автор начинает с диагностики, а не с хаотичных настроек.
avatar
0qpvype6z 03.04.2026
Отличный план на первые 5 минут паники, когда всё 'легло'. Сохранил себе в закладки.
avatar
7r9suiyvh0 03.04.2026
А как насчёт облачных managed-решений типа RDS? Там многие низкоуровневые настройки скрыты.
avatar
7teq8cpp 03.04.2026
Всё это бесполезно, если код приложения генерирует N+1 запрос. Оптимизировать нужно с двух сторон.
avatar
p71smig 03.04.2026
Не хватает упоминания про EXPLAIN для анализа запросов. Это основа основ оптимизации.
avatar
kf5cekhpw 03.04.2026
Статья хороший старт, но для продакшна нужно глубже: репликация, партиционирование, кэширование.
Вы просмотрели все комментарии