| Цитата |
|---|
| Евгений Жуков пишет: Во-первых, можно не перебирать все для получения ID продавцов, а заполнять массив по мере получения информации о товарах. |
Так и есть, однако есть сложность: товары выводятся в зависимости от фильтров, а фильтры должны содержать все значения из базы (наименования, марки и т.д.). Приходится делать отдельный запрос для получения значений фильтров и только потом выводить сами товары.
Разумеется, почти все массивы заполняются в запросе получения значений фильтров.
Основная проблема, как я вижу, это большой объем информации. Чтобы выбрать данные из инфоблока, на 1 запрос тратится порядка 1-5 секунд, в зависимости от общей загрузки сервера (без кеширования). Это очень долго.
Сейчас в базе порядка 50 тыс записей (в общем - ерунда), но почему-то тормозит.
А как можно изменить структуру ИБ, т.е. какие тут есть пути оптимизации?
| Код |
|---|
// получаем список предложений с заданным наименованием.
// из этого списка создаем списки для фильтров
$fltrOrder=array(
"PROPERTY_STARTPRICE"=>"ASC"
);
$fltrSelect=array(
'IBLOCK_ID',
'ID',
'PROPERTY_GOOD_NAME',
'PROPERTY_GOOD_NAME_VALUE',
'PROPERTY_MADE_BY',
'PROPERTY_MADEBY_VALUE',
'PROPERTY_MODEL',
'PROPERTY_MODEL_NAME_VALUE',
'PROPERTY_COUNTRY',
'PROPERTY_COUNTRY_VALUE',
'PROPERTY_CITY',
'PROPERTY_CITY_VALUE',
'PROPERTY_ENTERPRISE'
);
// выборка
$filter_res=CIBlockElement::GetList($fltrOrder,$fltrFilter,false, Array("nTopCount"=>200),$fltrSelect);
$i=0;$k=0;
while($fltr_fields = $filter_res->GetNext())
{
// создаём массив с кодами предприятий
if ($fltr_fields["PROPERTY_ENTERPRISE_VALUE"]>0) {
$arEnterprise[$fltr_fields["PROPERTY_ENTERPRISE_VALUE"]] = '';
$arEnterprise[$fltr_fields["PROPERTY_ENTERPRISE_VALUE"].'_phone'] = '';
}
// создаем массивы для фильтров
// если первы бокс - наименование
if (($fi=='n')) {
$name_sbox_full[$i] = $fltr_fields["PROPERTY_GOOD_NAME_VALUE_VALUE"]."<=>".$fltr_fields["PROPERTY_GOOD_NAME_VALUE"];
if ($fltr_fields["PROPERTY_GOOD_NAME_VALUE"] == $n_id) {
// выводим в селекты только те значения, у которых наименование = $n_id
$brand_sbox_full[$k] = $fltr_fields["PROPERTY_MADEBY_VALUE_VALUE"]."<=>".$fltr_fields["PROPERTY_MADE_BY_VALUE"];
$model_sbox_full[$k] = $fltr_fields["PROPERTY_MODEL_NAME_VALUE_VALUE"]."<=>".$fltr_fields["PROPERTY_MODEL_VALUE"];
$country_sbox_full[$k] = $fltr_fields["PROPERTY_COUNTRY_VALUE_VALUE"]."<=>".$fltr_fields["PROPERTY_COUNTRY_VALUE"];
$city_sbox_full[$k] = $fltr_fields["PROPERTY_CITY_VALUE_VALUE"]."<=>".$fltr_fields["PROPERTY_CITY_VALUE"];
++$k;
}
++$i;
}
...
|
Это код запроса для получения значений фильтров, далее идет второй запрос, собственно, выборка значений предложений.