Таблица menu_tree_hash
Таблица menu_tree_hash является вспомогательной таблицей в Drupal, которая хранит MD5-хеши для каждого элемента меню. Основное её назначение - ускорение рендеринга меню за счёт кэширования. Система вычисляет хеш текущего состояния элемента меню (включая его детей) и сравнивает его с сохранённым значением. Если хеш не изменился, используется закэшированная версия, что позволяет избежать дорогостоящих операций по построению дерева меню.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
menu_name |
varchar(32) |
Машинное имя меню (например, main, footer, account). Часть первичного ключа. Ссылается на таблицу menu_tree.
|
mlid |
int |
Уникальный идентификатор ссылки меню (Menu Link ID). Часть первичного ключа. Внешний ключ, который связывает хеш с конкретным элементом в таблице menu_tree.
|
hash |
varchar(64) |
MD5-хеш, вычисленный на основе данных элемента меню и всех его дочерних элементов. Хеш учитывает такие свойства, как активное состояние, вес, заголовок, путь и другие параметры, влияющие на отображение ссылки и её потомков. |
Как это работает
Когда Drupal готовит меню для отображения, для каждого элемента вычисляется его текущий хеш. Этот хеш генерируется на основе данных из menu_tree и других связанных данных, которые могут повлиять на внешний вид или активное состояние ссылки (например, права доступа, текущий путь).
Перед построением дерева меню система проверяет, существует ли в menu_tree_hash запись для данной пары menu_name и mlid. Если запись существует и значение поля hash совпадает с только что вычисленным хешем, это означает, что элемент меню и его поддерево не изменились. В этом случае Drupal может использовать закэшированную HTML-разметку для этой части меню, что значительно ускоряет процесс.
Если хеши не совпадают или запись отсутствует, система заново строит эту часть меню, обновляет хеш в таблице menu_tree_hash и кэширует итоговый HTML. Такой механизм обеспечивает эффективное кэширование даже для очень больших и сложных меню.
Записи в этой таблице автоматически обновляются или удаляются при любых изменениях в структуре меню: добавлении, удалении или изменении ссылок, а также при очистке кэша.
Пример SQL-запроса
Посмотреть хеши для всех элементов определённого меню можно следующим запросом:
SELECT mth.mlid, mth.hash, mt.title
FROM menu_tree_hash mth
INNER JOIN menu_tree mt ON mth.mlid = mt.mlid
WHERE mth.menu_name = 'main'
ORDER BY mth.mlid;
Смотрите также
-
таблицу
menu_tree,
которая хранит основные данные элементов меню -
таблицу
menu_link_content,
которая хранит данные для ссылок меню, созданных через интерфейс -
таблицу
cache_menu,
которая хранит закэшированную HTML-разметку меню -
таблицу
router,
которая хранит информацию о путях системы