Как найти тяжёлые запросы MySQL в Битрикс
Сначала собираем медленные SQL-запросы под реальной нагрузкой, затем связываем их со страницей и только после этого меняем выборку или индекс.
Высокая загрузка MySQL не показывает, какой код виноват. Один запрос может выполняться секунду, другой — пять миллисекунд, но повторяться тысячи раз. Нужны частота, длительность, число просмотренных строк и контекст страницы.
1. Зафиксируйте пользовательский симптом
Запишите URL, фильтры, пользователя, время и повторяемость. Измерьте TTFB и время компонента. Без контекста slow log превращается в длинный список, не связанный с бизнес-сценарием.
2. Включите slow query log на ограниченное окно
Официальная документация MySQL указывает, что журнал по умолчанию отключён. Порог long_query_time и минимальное число просмотренных строк подбирают под нагрузку. Журнал может быстро расти, поэтому заранее настройте путь, ротацию и время выключения.
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW FULL PROCESSLIST;Изменение глобальных параметров требует прав администратора базы и должно учитывать способ управления MySQL в вашем окружении.
3. Сгруппируйте похожие запросы
mysqldumpslow -s t -t 20 /path/to/mysql-slow.log
mysqldumpslow -s c -t 20 /path/to/mysql-slow.logПервый отчёт показывает дорогие по времени группы, второй — самые частые. Суммарный ущерб часто создаёт именно частая выборка внутри цикла.
4. Изучите план выполнения
Выполняйте EXPLAIN с безопасными параметрами на тестовой копии. Смотрите тип доступа, выбранный индекс, оценку строк, временные таблицы и сортировку. План без реальных объёмов данных может отличаться от production.
5. Найдите PHP-источник
Ищите таблицы, поля и конструкцию запроса в пользовательском коде. В Битрикс типовые причины — запрос внутри цикла, выбор всех свойств, неоправданная сортировка, некешируемый компонент, большой offset и неправильная модель фильтра.
6. Исправьте причину и измерьте снова
- объедините повторные выборки;
- выбирайте только нужные поля;
- проверьте кеш и его ключ;
- добавляйте индекс только под доказанный запрос;
- сравните время, rows examined и нагрузку до и после.