Устранение неполадок в запросах MySQL

Этот мануал является частью серии статей по устранению неполадок и диагностике настроек MySQL. Здесь мы рассмотрим некоторые общие проблемы, с которыми сталкиваются многие пользователи MySQL, и предоставим рекомендации по устранению конкретных ошибок. Также здесь вы найдете ссылки на другие мануалы и официальную документацию по MySQL, которые могут быть полезны в некоторых случаях.

Читайте также: Доступ к логам ошибок MySQL

Иногда пользователи сталкиваются с проблемами при выдаче запросов на свои данные. В некоторых системах баз данных, включая MySQL, операторы запросов должны заканчиваться точкой с запятой (;), иначе система не будет знать, что запрос завершен. Например:

SHOW * FROM table_name;

Если вы забудете добавить точку с запятой в конец запроса, система подумает, что запрос продолжается в новой строке. Чтобы завершить запрос, введите точку с запятой и нажмите Enter.

Некоторые пользователи могут заметить, что их запросы обрабатываются чрезвычайно медленно. Один из способов определить, какой оператор запроса является причиной замедления, — просмотреть лог медленных запросов MySQL. Для этого откройте файл mysqld.cnf, который используется для настройки параметров сервера MySQL. Этот файл обычно хранится в каталоге /etc/mysql/mysql.conf.d/.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Найдите в файле следующие строки:

. . .
#slow_query_log         = 1
#slow_query_log_file    = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
. . .

Эти закомментированные директивы настраивают параметры MySQL по умолчанию для лога медленных запросов. Вот что делает каждая из них:

  • slow-query-log: значение 1 включает лог медленных запросов.
  • slow-query-log-file: определяет файл, в котором MySQL будет регистрировать медленные запросы. В данном случае это /var/log/mysql-slow.log.
  • long_query_time: при значении 2 MySQL будет регистрировать все запросы, на обработку которых ушло больше 2 секунд.
  • log_queries_not_using_indexes: позволяет MySQL логировать все запросы без индекса в файл /var/log/mysql-slow.log. Этот параметр не обязателен для работы лога медленных запросов, но он может быть полезен для выявления неэффективных запросов.

Раскомментируйте каждую из этих строк, удалив символ # в начале строки. Раздел теперь должен выглядеть так:

. . .
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes
. . .

Примечание: Если вы используете MySQL 8+, этих строк не будет в mysqld.cnf по умолчанию. В таком случае вам нужно добавить в конец файла эти строки:

. . .
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes

Включив лог медленных запросов, сохраните и закройте файл. Затем перезапустите MySQL:

sudo systemctl restart mysql

Теперь вы можете обнаружить проблемные операторы запросов при помощи лога медленных запросов.  Для этого можно использовать less:

sudo less /var/log/mysql_slow.log

Определив проблемные запросы, которые замедляют работу, вы можете оптимизировать их. В этом вам поможет мануал Оптимизация запросов и таблиц MySQL и MariaDB.

Кроме того, в MySQL есть оператор EXPLAIN, который предоставляет информацию о том, как MySQL выполняет запросы. Эта страница из официальной документации MySQL дает представление о том, как использовать EXPLAIN для определения неэффективных запросов.

Больше информации об основных структурах запросов вы найдете в  мануале Запросы в MySQL.

Tags: