@IliaMal

Как найти метод с медленным запросом к БД и как сократить время выполнения?

Здравствуйте.

При мониторенге производительности быил выявлены медленые запросы к БД и из них большенство хитов это картинки.
5ed8aa44da370081574467.png

1. Как найти какой именно метод так нагружает БД?

Приведу сам проблемный запрос:
SELECT
   COUNT(DISTINCT
         BE.ID) as C
FROM
   b_iblock B
   INNER JOIN b_lang L ON
      B.LID = L.LID
   INNER JOIN b_iblock_element BE ON
      BE.IBLOCK_ID = B.ID
WHERE 1 = 1
   AND ((
         EXISTS (
            SELECT
               IBLOCK_ID
            FROM
               b_iblock_site
            WHERE
               IBLOCK_ID = B.ID
               AND (SITE_ID = 's1') ) )
      AND ( (
            BE.ACTIVE_TO >= now()
            OR BE.ACTIVE_TO IS NULL )
         AND (BE.ACTIVE_FROM <= now()
            OR BE.ACTIVE_FROM IS NULL ) )
   AND (BE.ACTIVE = 'Y')
      AND (BE.IBLOCK_ID = '2'))
   AND (BE.WF_STATUS_ID = 1
      AND BE.WF_PARENT_ELEMENT_ID IS NULL )
   AND ( B.ID IN (
         SELECT IBLOCK_ID
         FROM b_iblock_group IBG
         WHERE IBG.GROUP_ID IN (2)
            AND IBG.PERMISSION >= 'R'
            AND (
               IBG.PERMISSION = 'X'
               OR B.ACTIVE = 'Y'
            ))
      OR (
         B.RIGHTS_MODE = 'E'
         AND EXISTS (
            SELECT
               ER.ELEMENT_ID
            FROM
               b_iblock_element_right ER
               INNER JOIN b_iblock_right IBR ON
                  IBR.ID = ER.RIGHT_ID
               INNER JOIN b_user_access UA ON
                  UA.ACCESS_CODE = IBR.GROUP_CODE
                  AND UA.USER_ID = 0
            WHERE
               ER.ELEMENT_ID = BE.ID
               AND IBR.OP_EREAD = 'Y'
         ) ))

Тут много вложенных уловий, как можно это сократить?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
smilingcheater
@smilingcheater
У вас эти картинки реально на файловой есть? Выглядит так, будто картинки нет, вместо неё возвращается 404, которая отдаётся битриксом. Я бы предложил открыть в браузере 404, включить битриксовую отладку (панель эрмитажа, развернуть, кнопка "Отладка") и в выведенной отладочной информации искать виновника.

На вашем скрине в статистике время выполнения запросов порядка 0.25-0.35 сек, но время выполнения всей страницы доходит до 4-5 сек. Выглядит так, будто какой-то тяжёлый компонент на 404 работает с выключенным кешированием.

А ещё лучше - настроить, чтобы картинки отдавал NGINX, и 404 на картинки тоже он.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
профайлером.
смотреть план запроса.
Ответ написан
2ord
@2ord
продвинутый чайник
Хреновый запрос, однако. Мои мысли по поводу улучшений:
COUNT DISTINCT => COUNT(*), GROUP BY
EXISTS => LEFT JOIN
IN (SELECT ...) => INNER JOIN

Не гарантирую, что прав 100%.
А, вообще, такие запросы следует дробить. Такие сложные запросы - это признак плохого проектирования. Лучше воспользоваться дополнительными таблицами для хранения состояний.
Шаблон материализованного представления
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
05 июл. 2020, в 10:19
600 руб./в час
05 июл. 2020, в 10:05
500 руб./за проект