Вот грызла меня мысль, что иногда изобретение велосипеда оправдано. И, как показала практика - не зря.
Сравним две страницы (выборка из одного инфоблока, в инфоблоке порядка 100 000 записей):
http://127.0.0.1/2008/
сделано на компоненте bitrix:news.list
Время создания страницы: 18.108 сек.
Всего SQL запросов: 41
Время исполнения запросов: 16.7361 сек.
ужос...
http://127.0.0.1/2008/2/
сделано руками
Время создания страницы: 0.8206 сек.
Всего SQL запросов: 15
Время исполнения запросов: 0.0292 сек.
Ничо так разница, правда?
Сервер - один и тот же, инфоблок, количество записей - одно и то же, время тестирования - совпадает.
Поклацав по пагинатору, в первом случае я дождался минимального времени генерации страницы 4,5 секунды (время горения запала УЗРГМ, однако...).
Во втором случае максимальное время генерации страницы составило 1.78 секунды.
И в первом, и во втором случае было отсмотрено по 10 страниц, кэш предварительно был очищен.
Итог: в самоделку добавлено кэширование, пагинатор в самоделке доработан напильником и, в настоящее время успешно используется.
Все-таки есть разница между:
SELECT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID,BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,BE.NAME as NAME,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 ACTIVE_FROM,B.DETAIL_PAGE_URL as DETAIL_PAGE_URL,BE.DETAIL_TEXT as DETAIL_TEXT,BE.DETAIL_TEXT_TYPE as DETAIL_TEXT_TYPE,BE.PREVIEW_TEXT as PREVIEW_TEXT,BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE,BE.PREVIEW_PICTURE as PREVIEW_PICTURE, FPS0.*,L.DIR as LANG_DIR,BE.SORT as SORT,BE.CODE as CODE,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 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 INNER JOIN b_iblock_element_prop_s4 FPS0 ON FPS0.IBLOCK_ELEMENT_ID = BE.ID INNER JOIN ( SELECT DISTINCT B.ID FROM b_iblock B INNER JOIN b_iblock_site BS ON BS.IBLOCK_ID = B.ID WHERE ((((BS.SITE_ID="s1")))) AND ((((B.ID = "4")))) ) BB ON BB.ID = BE.IBLOCK_ID WHERE 1=1 AND ( ((((BE.IBLOCK_ID = "4")))) AND ((((BE.ACTIVE="Y")))) AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL))) ) AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) ORDER BY BE.ACTIVE_FROM desc ,BE.SORT asc ,BE.ID desc LIMIT 40, 20 |
SELECT COUNT(ID) AS CNT FROM b_iblock_element WHERE IBLOCK_ID="4"; SELECT B.ID, B.ACTIVE_FROM, B.NAME, B.PREVIEW_TEXT, B.CODE, P.PROPERTY_13, P.PROPERTY_14 FROM b_iblock_element AS B, b_iblock_element_prop_s4 AS P WHERE B.IBLOCK_ID ="4" AND B.ID = P.IBLOCK_ELEMENT_ID ORDER BY ACTIVE_FROM DESC LIMIT 120,20 |