Ускорить отображение списка элементов информационного блока за счет устранения запроса текста детального просмотра

Рейтинг: 4.4768  
На голосовании
Предложил Пользователь 269 04.05.2017 19:29:52

Ускорить отображение списка элементов информационного блока за счет устранения запроса текста детального просмотра

Предлагаю ускорить отображение списка элементов информационного блока за счет устранения ненужного запроса из базы текста детального просмотра. Этот текст для каждой новости может достигать громадных размеров, а для всего списка он суммируется, что приводит также к большому потреблению оперативной памяти.

 

Текст детального просмотра целиком нужен лишь при детальном отображении лишь одного элемента новости. Когда мы выводим спискок элементов, например список новостей, то весь текст детального просмотра не нужен, а нужен лишь признак его наличия, чтобы принять решение, отобразить ли URL на детальный просмотр.
Однако, при формировании списка, из базы одним запросом извлекаются все тексты детального просмотра всех элементов, отображаемых на экране. Это приводит не только к излишней перекачке данных, но и забивает большими размерами кеш SQL-запросов MySQL.
Проблема усугубляется тем обстоятельством, что нет никакого параметра, который бы позволял избежать загрузки текста детального просмотра при формировании списка.

Предлагаю ввести параметр, используемый при вызове компонента информационного блока, который бы указывал, что вместо текста детального просмотра нам нужен лишь признак его наличия или отсутствия:  LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY



Изменяем /bitrix/components/bitrix/news.list/component.php

Там есть список принудительно добавляемых параметров. Ищем такую строку
$arSelect = array_merge($arParams["FIELD_CODE"], array(
из этого списка убираем  "DETAIL_TEXT" и "DETAIL_TEXT_TYPE"

после этого списка добавляем такой код:

   if ($arParams["LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY"]=="Y";)
   {
$arSelect[]="HAS_DETAIL_TEXT";
   } else
   {
$arSelect[]="DETAIL_TEXT";
    $arSelect[]="DETAIL_TEXT_TYPE";
   }

То есть при наличии LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY == Y, будем запрашивать только признак, иначе – как раньше, по старой схеме, целиком текст.

Мы добавили запрос нового вычисляемого поля HAS_DETAIL_TEXT – осталось ввести его поддержку.

В /bitrix/modules/iblock/classes/mysql/iblockelement.php, там где идёт перевод названий параметров в названия колонок базы данных, добавляем такую строчку после «"DETAIL_TEXT_TYPE"=>"BE.DETAIL_TEXT_TYPE",»:

"HAS_DETAIL_TEXT"=>"((BE.DETAIL_TEXT IS NOT NULL) AND (BE.DETAIL_TEXT<>''))",

Во всех наших шаблонах, где есть примерно такой код:
   <?if(!$arParams["HIDE_LINK_WHEN_NO_DETAIL"] || ($arItem["DETAIL_TEXT"] && $arResult["USER_HAVE_ACCESS"])):?>
 <h3>"><?echo $arItem["NAME"]?></h3>
  <?else:?>
просто заменяем "DETAIL_TEXT" на "HAS_DETAIL_TEXT"

также в файлах, которые передают параметры шаблонам (news.php), добавляем передачу нашего параметра:
   "LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY" => $arParams["LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY"],

И при вызове комплексного компонента новостей, также указываем наш параметр:

   "LIST_CHECK_DETAIL_TEXT_PRESENCE_ONLY" => "Y",

простое и надёжное изменение привело к существенному повышению производительности, уменьшило скорость формирования списка новостей, и самое главное, разгрузило кеш базы