Предлагаемые индексы для таблицы MPTT

Я просто создаю таблицу для хранения иерархических данных с использованием модифицированного обхода дерева предварительного заказа (MPTT) - вы знаете один: каждый узел хранит идентификаторы left и right для поиска своих потомков. Я использую модель, предложенную CakePHP, которая отличается от стандартной за счет включения parent_id в каждую строку.

Вот предлагаемая структура таблицы:

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    parent_id INTEGER(10) DEFAULT NULL,
    lft INTEGER(10) DEFAULT NULL,
    rght INTEGER(10) DEFAULT NULL,
    name VARCHAR(255) DEFAULT '',
    PRIMARY KEY  (id)
);

Я никогда раньше не использовал этот стиль и не зная точно, как его ищут, поэтому мне интересно, какие поля мне следует индексировать? Достаточно ли только первичного ключа, или я должен также включить lft и rght?


person nickf    schedule 20.10.2009    source источник


Ответы (2)


Я обычно индексирую только левый столбец. Я обычно работаю с mysql, который позволяет использовать только одного пользователя индекса для каждой таблицы в плане выполнения, а индекс слева помогает каждому запросу, который я когда-либо писал для таблицы MPTT, и преимущества включения прямо в этот индекс минимальны.

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

person longneck    schedule 21.10.2009

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

WHERE lft = (rgt -1)

Поэтому я обычно просто создаю индекс с парой lft, rgt.

person cjimti    schedule 07.02.2010
comment
Этот. Большинство деревьев читаются намного чаще, чем записываются, поэтому наличие двухколоночного индекса (а не двух отдельных индексов) слева и справа - это здорово. Кроме того, если вы храните несколько деревьев в одной таблице, например группировка по пользователю, сделайте индекс из трех столбцов по grouping_id, left, right. - person Walf; 29.04.2011