Минуты 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';` для поиска "висящих" запросов прямо сейчас.
- Используйте `EXPLAIN` (или `EXPLAIN ANALYZE` в MySQL 8.0.18+) для каждого медленного запроса. Смотрите на ключевые колонки:
* `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` на большие таблицы, проверяйте наличие индексов по полям соединения. Кэшируйте результаты тяжелых агрегирующих запросов на уровне приложения или используйте материализованные представления.
- **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` используйте кэш приложения.
- Регулярно анализируйте slow log с помощью `pt-query-digest` из Percona Toolkit. Это покажет вам "самых злостных нарушителей".
- Настройте мониторинг ключевых метрик: скорость запросов (QPS), загрузка CPU, использование оперативной памяти, I/O дисков, размер репликационного лага.
- Проводите регулярное обслуживание: `OPTIMIZE TABLE` для сильно фрагментированных таблиц (осторожно, блокирует таблицу), очистка старых бинарных логов.
- Рассмотрите архитектурные улучшения: репликация чтения (read replicas) для распределения нагрузки, шардинг для очень больших таблиц.
- Включите slow query log, если он выключен.
- Найдите 1-2 самых медленных запроса с помощью `pt-query-digest`.
- Проанализируйте их через `EXPLAIN`.
- Создайте недостающий индекс или перепишите запрос.
- Измерьте улучшение.
Комментарии (14)