Оптимизация SQL запроса битрикс

76
16 января 2022, 03:30

сразу к сути

Битрикс генерирует запрос для получения списка товаров блока "Товары для " сортировка обязательно рандомная, да и изменение скорости небольшое, который выполняется 4-5 секунд

Пример страницы

Нужно его оптимизировать, подскажите хотя бы сторону в которую копать

MySQL настроен по рекомендациям для битрикса

SELECT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID,BE.CODE as CODE,BE.XML_ID as XML_ID,BE.NAME as NAME,BE.ACTIVE as ACTIVE,IF(EXTRACT(HOUR_SECOND
FROM
BE.ACTIVE_FROM)>0, DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y %H:%i:%s'), DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y')) as DATE_ACTIVE_FROM,IF(EXTRACT(HOUR_SECOND
FROM
BE.ACTIVE_TO)>0, DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y %H:%i:%s'), DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y')) as DATE_ACTIVE_TO,BE.SORT as SORT,BE.PREVIEW_TEXT as PREVIEW_TEXT,BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE,BE.DETAIL_TEXT as DETAIL_TEXT,BE.DETAIL_TEXT_TYPE as DETAIL_TEXT_TYPE,DATE_FORMAT(BE.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE,BE.CREATED_BY as CREATED_BY,BE.TAGS as TAGS,DATE_FORMAT(BE.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X,BE.MODIFIED_BY as MODIFIED_BY,BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,B.DETAIL_PAGE_URL as DETAIL_PAGE_URL,BE.DETAIL_PICTURE as DETAIL_PICTURE,BE.PREVIEW_PICTURE as PREVIEW_PICTURE,L.DIR as LANG_DIR,BE.XML_ID as EXTERNAL_ID,B.IBLOCK_TYPE_ID as IBLOCK_TYPE_ID,B.CODE as IBLOCK_CODE,B.XML_ID as IBLOCK_EXTERNAL_ID,B.LID as LID , PRD.TYPE as TYPE, PRD.AVAILABLE as AVAILABLE, PRD.BUNDLE as BUNDLE, PRD.QUANTITY as QUANTITY, IF (PRD.QUANTITY_TRACE = 'D', 'Y', PRD.QUANTITY_TRACE) as QUANTITY_TRACE, IF (PRD.CAN_BUY_ZERO = 'D', 'Y', PRD.CAN_BUY_ZERO) as CAN_BUY_ZERO, PRD.MEASURE as MEASURE, IF (PRD.SUBSCRIBE = 'D', 'Y', PRD.SUBSCRIBE) as SUBSCRIBE, PRD.VAT_ID as VAT_ID, PRD.VAT_INCLUDED as VAT_INCLUDED, PRD.WEIGHT as WEIGHT, PRD.WIDTH as WIDTH, PRD.LENGTH as LENGTH, PRD.HEIGHT as HEIGHT, PRD.PRICE_TYPE as PAYMENT_TYPE, PRD.RECUR_SCHEME_LENGTH as RECUR_SCHEME_LENGTH, PRD.RECUR_SCHEME_TYPE as RECUR_SCHEME_TYPE, PRD.TRIAL_PRICE_ID as TRIAL_PRICE_ID, PRD.QUANTITY_TRACE as QUANTITY_TRACE_RAW, PRD.CAN_BUY_ZERO as CAN_BUY_ZERO_RAW, PRD.SUBSCRIBE as SUBSCRIBE_RAW, PRD.PURCHASING_PRICE as PURCHASING_PRICE, PRD.PURCHASING_CURRENCY as PURCHASING_CURRENCY, PRD.BARCODE_MULTI as BARCODE_MULTI, PRD.WITHOUT_ORDER as WITHOUT_ORDER
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
left join b_catalog_product as PRD on (PRD.ID = BE.ID)
WHERE
1=1 AND ( ((( BE.ID IS NULL OR NOT (BE.ID = '196304')))) AND ((((BE.ACTIVE='Y')))) AND (( 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.IBLOCK_ID = '10')))) AND ((((PRD.AVAILABLE='Y')))) ) AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
ORDER BY
RAND(620429) ,BE.ID desc
LIMIT 20

Тот же запрос в отформатированном виде:

SELECT  BE.ID as ID,
        BE.IBLOCK_ID as IBLOCK_ID,
        BE.CODE as CODE,
        BE.XML_ID as XML_ID,
        BE.NAME as NAME,
        BE.ACTIVE as ACTIVE,
        IF( EXTRACT(HOUR_SECOND FROM BE.ACTIVE_FROM)>0, 
            DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y %H:%i:%s'), 
            DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y')) as DATE_ACTIVE_FROM,
        IF( EXTRACT(HOUR_SECOND FROM BE.ACTIVE_TO)>0, 
            DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y %H:%i:%s'), 
            DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y')) as DATE_ACTIVE_TO,
        BE.SORT as SORT,
        BE.PREVIEW_TEXT as PREVIEW_TEXT,
        BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE,
        BE.DETAIL_TEXT as DETAIL_TEXT,
        BE.DETAIL_TEXT_TYPE as DETAIL_TEXT_TYPE,
        DATE_FORMAT(BE.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE,
        BE.CREATED_BY as CREATED_BY,
        BE.TAGS as TAGS,
        DATE_FORMAT(BE.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X,
        BE.MODIFIED_BY as MODIFIED_BY,
        BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,
        B.DETAIL_PAGE_URL as DETAIL_PAGE_URL,
        BE.DETAIL_PICTURE as DETAIL_PICTURE,
        BE.PREVIEW_PICTURE as PREVIEW_PICTURE,
        L.DIR as LANG_DIR,
        BE.XML_ID as EXTERNAL_ID,
        B.IBLOCK_TYPE_ID as IBLOCK_TYPE_ID,
        B.CODE as IBLOCK_CODE,
        B.XML_ID as IBLOCK_EXTERNAL_ID,
        B.LID as LID , 
        PRD.TYPE as TYPE, 
        PRD.AVAILABLE as AVAILABLE, 
        PRD.BUNDLE as BUNDLE, 
        PRD.QUANTITY as QUANTITY, 
        IF (PRD.QUANTITY_TRACE = 'D', 'Y', PRD.QUANTITY_TRACE) as QUANTITY_TRACE, 
        IF (PRD.CAN_BUY_ZERO = 'D', 'Y', PRD.CAN_BUY_ZERO) as CAN_BUY_ZERO, 
        PRD.MEASURE as MEASURE, 
        IF (PRD.SUBSCRIBE = 'D', 'Y', PRD.SUBSCRIBE) as SUBSCRIBE, 
        PRD.VAT_ID as VAT_ID, 
        PRD.VAT_INCLUDED as VAT_INCLUDED, 
        PRD.WEIGHT as WEIGHT, 
        PRD.WIDTH as WIDTH, 
        PRD.LENGTH as LENGTH, 
        PRD.HEIGHT as HEIGHT, 
        PRD.PRICE_TYPE as PAYMENT_TYPE, 
        PRD.RECUR_SCHEME_LENGTH as RECUR_SCHEME_LENGTH, 
        PRD.RECUR_SCHEME_TYPE as RECUR_SCHEME_TYPE, 
        PRD.TRIAL_PRICE_ID as TRIAL_PRICE_ID, 
        PRD.QUANTITY_TRACE as QUANTITY_TRACE_RAW, 
        PRD.CAN_BUY_ZERO as CAN_BUY_ZERO_RAW, 
        PRD.SUBSCRIBE as SUBSCRIBE_RAW, 
        PRD.PURCHASING_PRICE as PURCHASING_PRICE, 
        PRD.PURCHASING_CURRENCY as PURCHASING_CURRENCY, 
        PRD.BARCODE_MULTI as BARCODE_MULTI, 
        PRD.WITHOUT_ORDER as WITHOUT_ORDER
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
left join   b_catalog_product as PRD on (PRD.ID = BE.ID)
WHERE   1=1 
    AND (   (   (   (   BE.ID IS NULL 
                     OR NOT (BE.ID = '196304')
                    )
                )
            ) 
        AND ((((BE.ACTIVE='Y')))) 
        AND ((  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.IBLOCK_ID = '10')))) 
        AND ((((PRD.AVAILABLE='Y')))) 
        ) 
    AND (((     BE.WF_STATUS_ID=1 
            AND BE.WF_PARENT_ELEMENT_ID IS NULL
        )))
ORDER BY
RAND(620429) ,BE.ID desc
LIMIT 20
READ ALSO
make: *** [Makefile:204: shared/core_stream.lo] Error 1

make: *** [Makefile:204: shared/core_stream.lo] Error 1

Имеется Debian 10, Php 74

123
Как очищать полностью папку с помощью schedule

Как очищать полностью папку с помощью schedule

Есть файл Kernelphp он срабатывает каждые 10 мин

126
Как объединить значения из нескольких полей в одно?

Как объединить значения из нескольких полей в одно?

Есть у меня таблица product и в ней есть несколько полей: a1,a2,a3Поля a1,a2 со значениями

109