2009-10-20 8 views
3

Je ne fais que construire une table pour stocker des données hiérarchiques en utilisant le MPTT (Modified Pre-Order Tree Traversal) - vous connaissez celui-ci: chaque nœud stocke les ID left et right pour trouver ses descendants . J'utilise un modèle suggéré par CakePHP, qui varie de la manière standard en incluant le parent_id avec chaque ligne.Indices suggérés pour une table MPTT

est ici la structure de table suggérée:

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) 
); 

ayant jamais utilisé ce style avant, et ne sachant pas exactement comment il se recherche, je me demande quels domaines je devrais être indexation? Est-ce que la clé primaire suffit, ou devrais-je inclure lft et rght aussi?

Répondre

1

Je indexe généralement juste la colonne de gauche. Je travaille habituellement avec mysql, qui n'autorise qu'un seul utilisateur d'index par table dans un plan d'exécution, et un index sur la gauche aide toutes les requêtes que j'ai jamais écrites pour une table MPTT et les avantages de include right dans cet index sont minimes. En bref, selon mon expérience, un seul indice sur la gauche est l'équilibre optimal entre la vitesse d'insertion/mise à jour et la vitesse de sélection pour presque tous les cas d'utilisation.

4

Vous utiliserez toujours la colonne de gauche, mais j'ai souvent besoin de trouver tous les nœuds de feuilles.

WHERE lft = (rgt -1) 

Je crée donc simplement un index avec la paire lft, rgt.

+3

Ce. La plupart des arbres sont lus beaucoup plus qu'ils ne sont écrits, donc avoir un index à deux colonnes (pas deux index séparés) à gauche et à droite est génial. En outre, si vous stockez plusieurs arbres dans la même table, par ex. regrouper par utilisateur, en faire un index à trois colonnes sur grouping_id, left, right. – Walf

Questions connexes