Diversia
@Diversia

Как сократить время выполнения запроса с фильтром LOGIC?

Есть компонент в котором выполняется getList c LOGIC фильтром. Можно ли в данном случае как-то изменить фильтр для более быстрого выполнения?

$arFilter = array(
			"IBLOCK_ID" => 1,
			array(
				"LOGIC" => "OR",
				array("PROPERTY_actors" => $arResult["ID"]),
				array("PROPERTY_actorsMain" => $arResult["ID"]),
				array("PROPERTY_writer" => $arResult["ID"]),
				array("PROPERTY_director" => $arResult["ID"]),
			),
		);

		$rsElement = CIBlockElement::GetList(Array("PROPERTY_dateStart" => "DESC"), $arFilter, false, Array(), $arSelect);

601176e5652fb196903936.jpeg
Полагаю, что это из-за нескольких JOIN:

LEFT JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='ACTORS'
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
Diversia
@Diversia Автор вопроса
Отключение сортировки и селекта не помогла. Помогла только перестройка логики выборки. Добавил отдельное поле, которое включало все элементы по которым быль фильтр. Выборка заработало в ~10 разы быстрее.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
slashinin
@slashinin
Задачи для PHP https://justcoding.ru
Скорее всего дело не в джойнах, а в фильтрации и сортировке.

Для оптимизации запроса попробуйте временно убрать сортировку и массив $arSelect и глянуть, есть ли изменения.
Так же стоит выяснить наличие индексов в MySQL.
В админ панели битрикса есть страница с информацией об индексах.

Еще можно попробовать вынести данные инфоблока в отдельную таблицу (такая возможность есть в настройках инфоблока) и уже в новой таблице с инфоблоком глянуть индексы и если их там нет то создать самостоятельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы