2009-10-20 2 views
3

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

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

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 тоже?

ответ

1

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

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

4

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

WHERE lft = (rgt -1) 

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

+3

Это. Большинство деревьев читаются намного больше, чем они написаны, поэтому наличие индекса с двумя столбцами (не двух отдельных индексов) слева и справа отлично. Кроме того, если вы храните несколько деревьев в одной таблице, например. группируя пользователя, сделайте его индексом с тремя столбцами на grouping_id, слева, справа. – Walf

Смежные вопросы