GrabDuck

К2: снижаем количество запросов к базе. Часть 1 (без хаков) - K2 - Форум русской ...

:

В этой части речь пойдёт о безболезненных ( без хаков) способах снижения количества запросов к базе данных в К2.

Вторая часть (хаки) будет после выхода версии 2.5
Хотя пока по сборкам с svn не наблюдается движения в сторону решения этих вопросов.

Исходные данные:

Имеем 9 родительских и 24 дочерние категории. Родительские категории работают в режиме каталога, материалы публикуются в
дочерних категориях.

На главной необходимо отобразить последние материалы из всех категорий. Лимит вывода материалов - 20 на страницу.
Необходимо меню, в котором будут пункты для каждой из родительской категории и подчинённые им пункты для дочерних категорий.

Делаем всё казалось бы самым естественным и простым способом. Итог - имеем более 120 запросов к базе данных (более 160 с модулем K2 Tools).

Что делать:

1. Отказываемся от использования в качестве меню модуля K2 Tools.

Конечно очень соблазнительно выбрать категорию верхнего уровня и иметь в результате готовое дерево категорий в качестве меню.

Однако в данном случае функция treerecurse() модуля начинает строить запросы от корневой категории, разыскивая дочерние категории.

Для приведённых исходных данных, даже ограничив в модуле число отображаемых уровней 2-мя (чтобы избежать холостых запросов на поиск дочек у наших категорий низшего уровня), мы всё равно имеем 43 запроса для вывода модуля.

Вывод: как это ни трудоёмко при большом количестве категорий, всё же лучше делать меню через стандартное меню J!, назначая вручную категорию каждому пункту меню.

2. Грамотно назначаем параметры для пункта меню

Вспоминаем нашу задачу - необходимо вывести на Главной материалы из всех категорий в количестве 20 штук на страницу.

То есть нам необходимо для пункта меню Главная назначить тип меню К2 -> Списки материалов -> Категории

Со страшной силой тянет поддаться соблазну   ^-^ выбрать в основных параметрах пункта меню родительскую категорию (категории) и установить "Материалы из дочерних категорий" - "Да".

Нельзя по тем же соображениям, что и в пункте 1.

Вместо этого: Выбираем категории самого нижнего уровня и устанавливаем "Материалы из дочерних категорий" - " Нет".

Количество кликов мышкой будет конечно больше, зато в нашем примере будет на 49 69 запросов к базе меньше.

UPD: Пересчитал ещё раз )))

3. Настраиваем категории

"Наследовать параметры опций из категории" - опция, которая казалось бы призвана облегчить жизнь.

К сожалению, с точки зрения запросов к базе, сделано не совсем оптимально.

Логичнее было бы ограничиться одним запросом при создании (редактировании) категории, чтобы в параметры дочерней категории записать параметры родительской.
Или, в крайнем случае, цепочкой запросов, если меняются параметры родительской. В любом случае это происходило бы не так часто.

Сейчас же включение этой опции приводит к тому, что запрос параметров родительской категории происходит всякий раз при выводе материалов из дочерней или при выводе списка категорий.
Таким образом, если у нас на странице 20 категорий, у которых включена опция наследования - имеем дополнительно 20 запросов.

Выход: не использовать наследование, устанавливать вручную для каждой категории опции отображения.

4. Избавляемся от лишнего

Следует подумать - так ли уж необходимы при выводе списка материалов например отображение тегов или ссылки "добавить комментарий".
Вывод в списке категорий количества материалов в категориях также добавляет запросов.

Календарь, входящий как одна из функций в K2 Tools, тоже требует оптимизации - по одному запросу на каждый день месяца.

5. Ещё возможные направления:

Снизил ко-во запросов с 99 до 42 путем установки "режим каталога" (до этого просто стояла настройка "Количество Основных материалов" - 0)

To be continued... ^-^