@a_donov

Как построить дерево меню для максимально быстрой выдачи?

Имеем в MySQL таблицу с пунктами меню.
Поля для выборки:
id - id
id_parent - родитель
ordering - сортировка (кто первый)
public - вкл/выкл (boolean)
На текущий момент генерация меню - самый медленный модуль в системе (600ms при 700 пунктах меню в дереве)
Максимальный уровень вложенности дерева - 3.

Каким методом хранить деревья для максимальной производительности? Adjacency List или Nested Set?
Есть ли возможность кешировать дерево, чтобы не генерировать вновь?
  • Вопрос задан
  • 484 просмотра
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Что Adjacency List, что Nested Set позволяет построить дерево за один запрос.
Просто дергаете с сортировкой по id_parent и ordering и собираете в ассоциативный массив к примеру, чтобы потом во view размотать в то, что нужно.

Самое главное, не делать рекурсивную загрузку с запросами к БД, есть вероятность сделать ОЧЕНЬ много запросов к БД, что крайне непродуктивно.

Касаемо кэширования - тоже вариант хороший.
Схема простая - механизм построения дерева смотрит, есть ли кэш - если есть - отдает его, если нет - строит дерево и кэширует его (банальная сериализация, к примеру).
При записи/изменении ресурса, участвующего в дереве можно сбросить кэш, чтобы последующий запрос построил его и добавил в кэш.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
BuriK666
@BuriK666
Компьютерный псих
Покажите код, 700 пунктов это немного.
Ответ написан
Комментировать
Вообще странно, что у вас такая скорость - вы случайно не в цикле делаете запросы? Тут же один запрос к базе идет и потом все строится вложенной функцией. Как вариант можно хранить в сессии дерево либо в каком то кэше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы