Разработчики сайтов часто сталкиваются с проблемой падения производительности при выполнении MySQL запросов. При этом тестовый (эталонный/образцовый) запрос выполняется достаточно быстро. Причиной может служить неоптимизированный запрос или отсутствие индекса.
Вы можете активировать логгирование и провести анализ медленных запросов. При большом количестве строк в логе медленных запросов MySQL, читать его становится проблематично. На помощь придёт утилита mysqldumpslow.
Пример конфигурации my.cnf с включенными логами. Записываются запросы которые выполняются дольше пяти секунд и JOIN без индексов.
slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 5 log_queries_not_using_indexes = 1
Файл лога /var/log/mysql/slow.log необходимо создать руками:
mkdir /var/log/mysql touch /var/log/mysql/slow.log chown mysql.mysql -R /var/log/mysql
Утилита mysqldumpslow позволяет анализировать лог медленных запросов к базам.
Базовое применение:
# Показать 10 самых медленных запросов. Сортировка по среднему времени запроса. mysqldumpslow -s at -t 10 # Иногда требуется указать конкретный лог, имя лога xxxx-slow.log, где xxxx - обычно имя хоста. mysqldumpslow -s at -t 10 /var/log/mysql/slow.log mysqldumpslow -s at -t 10 /var/log/mysql/slow.log > Count: 2 Time=68.34s (136s) Lock=0.00s (0s) Rows=39892974.5 (79785949), root[root]@localhost > SELECT PL.pl_title, P.page_title > FROM page P > INNER JOIN pagelinks PL > ON PL.pl_namespace = P.page_namespace > WHERE P.page_namespace = N > …
Расшифровка заголовка:
- Count — количество вхождений запроса в лог;
- Time — среднее и общее время запроса;
- Lock — время блокировки таблицы;
- Rows — Количество выбранных строк