Медленная работа сайта — частая проблема, и её решение начинается с правильной диагностики.
В Битрикс есть мощные встроенные инструменты, которые помогают найти причину низкой производительности, от «тяжелых» SQL-запросов до некэшированных компонентов.
Инструмент 1: Панель отладки SQL-запросов (Локальная отладка)
Это первый и самый важный инструмент для поиска «тяжелых» запросов на конкретной странице. Он позволяет увидеть каждый SQL-запрос, который был выполнен во время генерации страницы.
Как включить?
Существует два способа, оба требуют прав на редактирование файлов ядра.
1. Современный способ (через .settings.php, рекомендуется)
Откройте файл /bitrix/.settings.php и включите режим отладки для ядра и для соединения с БД.
// /bitrix/.settings.php
return [
// ...
'exception_handling' => [
'value' => [
'debug' => true, // Включаем режим отладки ядра
],
// ...
],
'connections' => [
'value' => [
'default' => [
// ...
'debug' => true, // Включаем отладку для соединения с БД
],
],
// ...
],
];
2. Классический способ (через dbconn.php)
Откройте файл /bitrix/php_interface/dbconn.php и добавьте строку:
// /bitrix/php_interface/dbconn.php
// ...
$DBDebug = true; // Можно также использовать $DB->ShowSqlStat = true;
После включения внизу каждой страницы появится серая панель отладки. Перейдите на вкладку «SQL Запросы».
Что анализировать в панели отладки?
- Общее время выполнения страницы: Вкладка «Время». Если оно стабильно превышает 0.5-1 секунду, это явный признак проблем.
- Общее время SQL-запросов: Вкладка «SQL Запросы», строка «Время выполнения запросов». Если оно составляет значительную часть от общего времени страницы (> 30-50%), проблема точно в базе данных.
- Количество запросов: Если их больше 100-150, это почти всегда говорит об отсутствии кэширования или о «проблеме N+1» (выборка данных в цикле).
- Самые медленные запросы: Найдите запросы, время выполнения которых > 0.01 сек. Это ваши главные «подозреваемые».
- Дублирующиеся запросы: Если один и тот же запрос повторяется много раз, это 100% признак отсутствия кэширования.
Глубокий анализ с EXPLAIN
Напротив каждого запроса есть ссылка «Explain». Это команда MySQL, которая показывает план выполнения запроса. Это самый важный инструмент для оптимизации.
Ключ EXPLAIN | Что означает | Хорошо/Плохо |
type | Тип доступа к данным. | Плохо: ALL (полный перебор таблицы). Приемлемо: index (сканирование индекса). Хорошо: range, ref. Отлично: eq_ref, const, system. |
possible_keys | Возможные индексы, которые MySQL мог использовать. | — |
key | Реально использованный индекс. | Если NULL при наличии possible_keys, это проблема. |
rows | Критически важный параметр! Примерное количество строк, которые MySQL пришлось просканировать. | Чем меньше, тем лучше. Если здесь тысячи, а LIMIT 1, это очень плохо. |
Extra | Дополнительная информация. | Очень плохо: Using filesort (сортировка на диске), Using temporary (создание временной таблицы). Нормально: Using where, Using index. |
Что делать? Если вы видите type: ALL или Using filesort для запроса, который фильтрует или сортирует по определенным полям, значит, на эти поля необходимо добавить индекс в базе данных.
Инструмент 2: Монитор производительности (Глобальная отладка)
Этот модуль (perfmon) дает общую картину производительности всего сайта за период времени, а не одной страницы.
Путь в админке: Настройки -> Производительность -> Панель производительности.
Как использовать?
- Измерьте индекс производительности: На главной странице модуля. Он тестирует CPU, файловую систему и БД. «Эталонное» значение — около 30. Если у вас сильно меньше, возможно, проблемы в конфигурации сервера.
- Включите монитор: Нажмите «Включить монитор» и дайте ему поработать под реальной нагрузкой (от нескольких часов до суток).
- Анализируйте вкладки:
- SQL: Здесь собран ТОП самых медленных и частых запросов со всего сайта. Это позволяет найти глобальные проблемы, которые влияют на все разделы.
- Компоненты: Показывает, какие компоненты работают медленнее всего и вызываются чаще всего. Высокое «Среднее время выполнения» и большое «Кол-во вызовов» — явный признак компонента без кэширования.
- Кэширование: Показывает эффективность кэша. Ищите низкий «Коэф. кеширования» (отношение чтений к записям) и большие объемы записи (write size). Это может указывать на неэффективное или слишком часто сбрасываемое кэширование.
Инструмент 3: Программный трекер SQL (SqlTracker)
Иногда нужно отладить SQL-запросы не на публичной странице, а в агенте, REST-методе или cron-скрипте. Для этого в D7 есть программный трекер.
use Bitrix\Main\Application;
// 1. Получаем соединение и запускаем трекер
$connection = Application::getConnection();
$tracker = $connection->startTracker();
// 2. Выполняем код, который генерирует запросы
// ...
\Bitrix\Iblock\ElementTable::getList(['filter' => ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y']]);
// ...
// 3. Останавливаем трекер
$connection->stopTracker();
// 4. Анализируем собранные запросы
foreach ($tracker->getQueries() as $query) {
// $query - объект \Bitrix\Main\Diag\SqlTrackerQuery
echo "SQL: " . $query->getSql() . "<br>";
echo "Время: " . round($query->getTime(), 5) . " сек.<br>";
// print_r($query->getTrace()); // Можно получить полный стек вызовов
echo "<hr>";
}
Этот способ дает полный контроль и позволяет логировать запросы из любого места вашего кода.
Частые проблемы и их решение
- Проблема N+1: Самый частый убийца производительности.
- Плохо:codePHP
$rsItems = CIBlockElement::GetList(...); // 1 запрос while($arItem = $rsItems->Fetch()) { // В цикле для каждого элемента делается еще один запрос! $prop = CIBlockElement::GetProperty(..., $arItem['ID'], ...)->Fetch(); // N запросов }
- Хорошо: Получить все данные за один-два запроса. Либо выбрать свойства прямо в GetList, либо сначала собрать все ID, а потом одним запросом GetProperty получить свойства для всех ID.
- Плохо:codePHP
- Отсутствие кэширования: Любая выборка, которая не меняется каждую секунду, должна быть обернута в Bitrix\Main\Data\Cache или CPHPCache.
- Отсутствие индексов БД: Если EXPLAIN показывает type: ALL, создайте индекс для полей из WHERE и ORDER BY.
- select => [‘*’] в ORM: Никогда не используйте «звездочку», если вам не нужны все поля. Это особенно критично для полей типа TEXT, которые могут быть очень большими.
Вывод:
Отладка производительности — это системная работа. Начните с панели отладки SQL для конкретных медленных страниц.
Используйте EXPLAIN для глубокого анализа проблемных запросов.
Затем переходите к Монитору производительности для выявления глобальных проблем на всем сайте.
И не забывайте про кэширование — это 90% успеха в оптимизации сайта на Битрикс.
производительность Битрикс, монитор производительности, отладка SQL, медленные запросы, Explain, индекс, cache_joins, perfmon, SqlTracker, оптимизация Битрикс.