Настройка и анализ Slow Query Log в MySQL с помощью pt-query-digest
- Периодические пики загрузки процессора СУБД до 100% при выполнении сложных выборок.
- Рост времени отклика бекенд-сервисов и накопление блокировок на чтение/запись.
- Отсутствие прозрачной статистики по неоптимизированным SQL-запросам, выполняющим Full Table Scan.
1. Конфигурация Slow Query Log в MySQL
Добавьте параметры в /etc/mysql/my.cnf:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
# Порог времени выполнения запроса в секундах (поддерживаются микросекунды)
long_query_time = 0.5
# Логировать запросы без индексов
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 20
# Логировать административные команды (ALTER, OPTIMIZE)
log_slow_admin_statements = 1Включение на лету:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 0.5;2. Установка утилиты pt-query-digest
apt-get install -y percona-toolkit || dnf install -y percona-toolkit3. Анализ и генерация сводного отчета
pt-query-digest /var/log/mysql/mysql-slow.log > /tmp/slow_report.txt
head -n 40 /tmp/slow_report.txt4. Анализ топ-5 самых медленных запросов в реальном времени
pt-query-digest --limit=5 --order-by Query_time:sum /var/log/mysql/mysql-slow.log Частые вопросы (FAQ)
Какое влияние оказывает включенный slow_query_log на общую производительность MySQL?
При пороге long_query_time >= 0.1s накладные расходы составляют менее 1-2% CPU. При использовании log_queries_not_using_indexes рекомендуется обязательно задавать log_throttle_queries_not_using_indexes, чтобы исключить I/O флуд.
Как выполнить безопасную ротацию файла лога медленных запросов?
Переименуйте файл через mv /var/log/mysql/mysql-slow.log /var/log/mysql/mysql-slow.log.1 и отправьте сигнал серверу: mysqladmin flush-logs.