Здравствуйте, форумчане! У меня возникли трудности, в решении которых хотелось бы получить вашу помощь.
Есть каталог с 70 000 товаров. Сам сайт имеет региональные версии. Для товаров грузятся остатки по регионам, на основании их выставляется флаг доступности товара в конкретном регионе (свойство типа число, 1 – товар в наличии в этом регионе, 0 – товара нет на остатках в этом регионе).
На основании этой информации я строю меню разделов каталога. Делаю GetList товаров с фильтром :
$filterLees = array (
"PROPERTY_LEES_IS_NUM_12" => 1,
// не нулевой остаток
"!CATALOG_PRICE_4" => false
// есть цена региона
);
Этот GetList группирую по IBLOCK_SECTION_ID, чтобы понять в каких разделах есть товары для этого региона, а в каких нет, тем самым отфильтровать ненужные разделы при выборке CIBlockSection::GetList.
В итоге в show processlists повисают запросы со статусом Copying to tmp table, mysqld на 600% нагружает CPU сайт зависает.
Вот сам sql запрос:
SEL ECT BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID, COUNT( BE.ID) as CNT
FR OM 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
INNER JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='LEES_IS_NUM_12'
INNER JOIN b_iblock_element_property FPV0 ON FPV0.IBLOCK_PROPERTY_ID = FP0.ID AND FPV0.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN (
SELECT DISTINCT BSE.IBLOCK_ELEMENT_ID
FR OM b_iblock_section_element BSE
INNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID
WHERE ((BS.ACTIVE = 'Y'))
) BES ON BES.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_catalog_price CAT_P4 ON (CAT_P4.PRODUCT_ID = BE.ID AND CAT_P4.CATALOG_GROUP_ID = 4)
LEFT JOIN b_catalog_product CAT_PR ON (CAT_PR.ID = BE.ID)
LEFT JOIN b_catalog_iblock CAT_IB ON ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)
LEFT JOIN b_catalog_vat CAT_VAT ON (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID))
WH ERE 1=1
AND (
((((BE.IBLOCK_ID = '5'))))
AND ((((BE.ACTIVE='Y'))))
AND (((CAT_P4.PRICE IS NOT NULL)))
AND ((((FPV0.VALUE_NUM = '1'))))
)
AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
GROUP BY BE.IBLOCK_SECTION_ID
Заранее благодарен за любую помощь!
Есть каталог с 70 000 товаров. Сам сайт имеет региональные версии. Для товаров грузятся остатки по регионам, на основании их выставляется флаг доступности товара в конкретном регионе (свойство типа число, 1 – товар в наличии в этом регионе, 0 – товара нет на остатках в этом регионе).
На основании этой информации я строю меню разделов каталога. Делаю GetList товаров с фильтром :
$filterLees = array (
"PROPERTY_LEES_IS_NUM_12" => 1,
// не нулевой остаток
"!CATALOG_PRICE_4" => false
// есть цена региона
);
Этот GetList группирую по IBLOCK_SECTION_ID, чтобы понять в каких разделах есть товары для этого региона, а в каких нет, тем самым отфильтровать ненужные разделы при выборке CIBlockSection::GetList.
В итоге в show processlists повисают запросы со статусом Copying to tmp table, mysqld на 600% нагружает CPU сайт зависает.
Вот сам sql запрос:
SEL ECT BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID, COUNT( BE.ID) as CNT
FR OM 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
INNER JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='LEES_IS_NUM_12'
INNER JOIN b_iblock_element_property FPV0 ON FPV0.IBLOCK_PROPERTY_ID = FP0.ID AND FPV0.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN (
SELECT DISTINCT BSE.IBLOCK_ELEMENT_ID
FR OM b_iblock_section_element BSE
INNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID
WHERE ((BS.ACTIVE = 'Y'))
) BES ON BES.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_catalog_price CAT_P4 ON (CAT_P4.PRODUCT_ID = BE.ID AND CAT_P4.CATALOG_GROUP_ID = 4)
LEFT JOIN b_catalog_product CAT_PR ON (CAT_PR.ID = BE.ID)
LEFT JOIN b_catalog_iblock CAT_IB ON ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)
LEFT JOIN b_catalog_vat CAT_VAT ON (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID))
WH ERE 1=1
AND (
((((BE.IBLOCK_ID = '5'))))
AND ((((BE.ACTIVE='Y'))))
AND (((CAT_P4.PRICE IS NOT NULL)))
AND ((((FPV0.VALUE_NUM = '1'))))
)
AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
GROUP BY BE.IBLOCK_SECTION_ID
Заранее благодарен за любую помощь!