Связаться по:
[email protected]

Блог о системном администрировании серверов и сайтов

Установка, настройка программного обеспечения Linux, Windows операционных систем

Тормозит БД mysql

Rate this post

Что делать и как решить проблемы с производительностью базы данных MySQL. В данном случае мы не будем говорить об оптимизации сервера БД, а речь пойдет непосредственно о запросах в БД.

Итак имеет следующее, mysqltuner показывает нам, что все параметры БД настроены корректно и ресурсы используются эффективно. Но все же происходят некие зависания. Как найти проблемные запросы.

Лог медленных запросов

Для начала нам необходимо получить статистику. Для этого в БД включаем лог медленных запросов. Для этого в файл /etc/my.cnf добавим строки

  • log_slow_queries переменная задающая путь к файлу лога
  • long_query_time минимальное время выполнения запроса, который будет считаться медленным. Т.е. все запросы время выполнения которых 2 и более секунды попадут в лог

Иногда имеет смысл включить логирование запросов у которых нет индексов

После добавления значений в конфигурацию выполним перезагрузку бд

Далее ждем когда соберется статистика, чем больше времени на сбор данных тем более актуальные данные мы получим.

Обработка лога медленных запросов

Если у вас интенсивно выполняются запросы, и их достаточно много и медленных, то лог может вырости до больших размеров в несколько десятков гигабайт. Конечно же в таком логе разобраться практически не реально. При этом лог содержит повторяющиеся запросы. Что бы привести лог медленных запросов к читабельному виду, необходимо обработать его утилитой mk-query-digest или pt-query-digest.

Для установки Percona Toolkit  можно воспользоваться командой

Centos

Debian/Ubuntu

Далее запускаем обработку отчета

В результате мы получаем файл сгруппированных запросов

В данном файле формируется информация по топ 10 запросов

По первой таблице видно, что 1,2,3 отчеты занимают больше всего времени в виду их длительности и количество запусков.

Далее в файле следует информация по каждому номеру запроса из таблицы и имя БД в которой запрос был выполнен.

Далее подключаемся к БД из первого запроса

И выполняем план запроса предложенный в отчете

В результате мы получим план выполнения запроса.

Например

У Вас вывод получится абсолютно другой, но будет все теже десять строк, вот что они означают:

Т.е. для группировки используется временная таблица, которая потом еще и сортируется, причем сортировка происходит без использования каких-либо индексов.

Если в запросе присутствует GROUP BY, то MySQL всегда будет сортировать результаты. Если порядок выдаваемых результатов вам не важен, то лучше избавиться от данной операции (сортировки).

Либо же создать же индекс по полю по которому происходит сортировка, а так же индексы по вторичным ключам во всех таблицах из запроса (вторичный ключ — это поле, которое используется в JOIN).

Сохраняя выводы explaine запросов вы получите файл, который необходимо передать программисту, что бы он смог пересмотреть планы выполнения тяжелых запросов, добавить не достающих индексов, возможно изменить порядок join, исключить не обязательные условия и сортировки.

Оптимизация производительности сайта и сервера, обращайтесь [email protected]

1 Response

  1. Pingback : Отслеживание времени выполнения PHP скриптов » Администрирование серверов

Оставить комментарий

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.