Разработчики сайтов часто сталкиваются с проблемой падения производительности при выполнении 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 — Количество выбранных строк