0
10.11.200814:2710.11.2008 14:27:42
В продолжении темы "Почему не надо в базу лезть". Все изложенное - на личном опыте. Практически все есть в документации. Но кто ж ее читает...
Итак, типичная задачка выборки из инфоблоков (в основном гонял на инфоблоках 1.0, но подойдет и к 2.0).
$arFilter = array('IBLOCK_ID' => инфоблок, 'IBLOCK_TYPE' => 'тип инфоблока','EXTERNAL_ID' => array(10,20,30,40));
|
Пока записей кот наплакал - оно и ничего. У меня было ~ 1 млн. записей на Оракле. Сразу говорю - оптимизацией базы не занимался (после уже админ ваял), сначала выжал, что можно так.
1. Ни в коем разе тип инфоблока не использовать в фильтре вместе с ID инфоблока - там тогда сначала sql'ем проверяется, а совпадает ли. Тяжелый такой запросец.
2. При фильтре по полям типа varchar (EXTERNAL_ID, CODE, собственные свойства) если Вы указываете точные значения, то используйте модификатор = - ускорение на порядок (в sql получается
= вместо LIKE) - спасибо ТП, ткнула носом.
В итоге:
$arFilter = array('IBLOCK_ID' => инфоблок,'=EXTERNAL_ID' => array(10,20,30,40));
|
Затем делаете индекс по тем полям, по которым фильтруете. Если поле текстовое, индекс делается по UPPER(поле), а не по самому полю.
Ну и напоследок. В таблица Битрикса активно используется NULL для отсутствующих значений. Так что в фильтрах старайтесь избегать конструкций типа:
Записывается просто, но при больших объемах данных запрос IS NOT NULL нагружает систему, а индексы ситуацию в принципе спасти не могут. Или кешируйте такие запросы как можно дольше.