Mysql: Optimierung der Suche nach Super-Knoten in verschachtelten Mengenbaum

8

Ich habe hierarchische Daten in einem geschachtelten Mengenmodell (Tabelle: Projekte):

Meine Tabelle (Projekte):

%Vor%

Schön gedruckt:

%Vor%

Um den nächsten Superknoten von Knoten 3 zu finden (dessen lft-Wert bekannt ist), kann ich

machen %Vor%

Was mir eine Liste der Projekte im Pfad bis zum Knoten 3 gibt. Dann, indem ich MAX (projects.lft) der Ergebnisse gruppiere und finde, erhalte ich den nächsten Super-Knoten. Ich kann jedoch nicht scheinen, dass diese Abfrage schnell ausgeführt wird, sie verwendet nicht die Indizes, die ich definiert habe. EXPLAIN sagt:

%Vor%

Mysql versteht, welcher Index verwendet werden soll, muss aber trotzdem alle 10 Zeilen (oder 100 k in meiner tatsächlichen Tabelle) durchlaufen.

Wie kann ich MySql dazu bringen, diese Abfrage richtig zu optimieren? Ich füge ein Testskript hinzu.

%Vor%     
Joernsn 16.11.2009, 18:12
quelle

3 Antworten

11

Um geschachtelte Mengenabfragen in MySQL zu optimieren, sollten Sie einen Index SPATIAL ( R-Tree ) für die Set-Boxen erstellen:

%Vor%

Siehe diesen Artikel in meinem Blog für weitere Details:

Quassnoi 16.11.2009, 18:25
quelle
0

Wenn Sie den räumlichen Index nicht verwenden können, dann diese zwei Indizes:

%Vor%

Sollte einmalig sein. Das wird der Datenbank sehr helfen.

%Vor%

Ist nicht notwendig - es ist ein Duplikat von lftRgt.

    
Ariel 17.03.2011 13:06
quelle
0

Dies ist bei der Suche nach Hilfe zur Indizierung für verschachtelte Sätze aufgetreten.

Ich bin mit einer anderen Lösung gelandet, die sperrig ist, aber leicht vollständig indexiert werden kann. Es wird jedoch Updates noch langsamer machen. Allerdings poste ich es hier, da es anderen helfen könnte.

Wir haben eine Tabelle mit Produktkategorien, die Unterkategorien usw. haben können. Diese Daten sind ziemlich statisch.

Ich habe eine Tabelle eingerichtet, die die Beziehungen zwischen den Kategorien, die die Kategorie enthalten, und eine Zeile für jede übergeordnete Kategorie (einschließlich dieser bestimmten Kategorie) zwischenspeichert, zusammen mit dem Unterschied in der Tiefe.

Wenn eine Änderung an der tatsächlichen Kategorietabelle vorgenommen wird, trigger ich gerade eine Prozedur zum Neuerstellen der zwischengespeicherten Tabelle.

Dann kann alles, was nach der Eltern / Kind-Beziehung sucht, den Cache verwenden, um direkt zwischen einer Kategorie und allen ihren Kindern (oder einem Kind und allen Eltern) zu verlinken.

Die eigentliche Kategorietabelle.

%Vor%

Die einfache Cache-Tabelle: -

%Vor%

Die Prozedur: -

%Vor%

Dies könnte wahrscheinlich nützlich verbessert werden, wenn die Tabelle groß und häufig aktualisiert wird.

    
Kickstart 17.06.2016 15:31
quelle

Tags und Links