Этот мануал является частью серии статей по устранению неполадок и диагностике настроек 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.