Быстрой поиск долгих sql-запросов в MySql📖 Частенько нужно найти долгие запросы к базе данных, которые могут вызывать проблемы с производительностью и в целом тормозить работу скриптов или всего проекта. Для этого есть много разных инструментов, в том числе и дебаг-режимы внутри фреймворков или отладчики внутри CMS. Но не всегда они спасают, особенно, когда запросов много или под нагрузкой они себя ведут по-другому. Поэтому иногда приходится проверять запросы отдельно от логики бекенда, непосредственно в самом MySql.
📌 Самый простой вариант, это зайти в сам mysql и посмотреть, какие запросы чаще других висят в списке выполняемых и сколько времени они там находятся.
Для этого нужно подключиться к серверу по ssh. И зайти в mysql:
mysql -u ИМЯ_ПОЛЬЗОВАТЕЛЯ_БД -pПАРОЛЬ ИМЯ_БД
Далее выполнить запрос, который покажет все активные запросы, которые в этот момент выполняются:
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;
Чтобы руками каждый раз не делать запрос, можно сделать просмотр с автообновлением, например, раз в две секунды:
watch -n 2 "mysql -u ИМЯ_ПОЛЬЗОВАТЕЛЯ_БД -pПАРОЛЬ ИМЯ_БД -e \"SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;\""
📌 Это костыльный, но самый простой и быстрый вариант поиска долгих запросов. А чтобы по-человечески и полноценно профилировать запросы, можно использовать специальные программы, например mytop. Или включить и посмотреть логи mysql, там фиксируются все запросы, а так же время начала и завершения их выполнения.
Логи mysql часто бывают выключены, чтобы их активировать нужно отредактировать конфиг, чаще всего он лежит тут: /etc/mysql/my.cnf. Но бывает и тут /etc/my.cnf или /usr/local/mysql/my.cnf.
Для активации записи логирования запросов, в конфиге нужно включить флаг general_log и указать путь, куда логи будут записываться:
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/query.log
Далее нужно сохранить файл и перезапустить mysql командой:
sudo service mysql restart
#БазаЗнаний