Michael: Geschwindigkeit bei NestedSets abfrage

Also ich versuche meine Kategorien über 10.000 an der Zahl meinen Beiträgen zuzuordnen.

Es geht, aber die Perfomence ist unter aller S..

Meine Beiträge sind in der Tabelle beitrag vorhanden, dort gibt es auch die Spalte cat. die wiederrum aus der Tabelle Kategorie die einzelnen Katgorie holt.

Also habe ich es so gelösst (53 Sekunden)

  
SELECT a.titel FROM beitrag a  
WHERE  
kat IN  
(  
SELECT o.id  
FROM  
kategorien AS n,  
kategorien AS p,  
kategorien AS o  
WHERE  
o.lft BETWEEN p.lft AND p.rgt  
AND o.lft BETWEEN n.lft AND n.rgt  
AND n.id = 10  
GROUP BY o.lft  
)  
ORDER BY a.date DESC LIMIT 10

wenn ich aber vorher die Netset abfrage und dann in einem zweiten Anlauf ausgebe:

  
SELECT a.titel FROM beitrag a  
WHERE  
cat IN  
(  
10,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,201,202,203,205,206,207,208,209,210,212,211  
)  
ORDER BY a.date DESC LIMIT 10

sind es nur  0.0030 Sekunden

WO habe ich den meinen Fehler, der das alles so verlangsamt?

  1. Meine Herren!

    wenn ich aber vorher die Netset abfrage und dann in einem zweiten Anlauf ausgebe:
    […]
    sind es nur  0.0030 Sekunden

    Wirklich interessant wäre gewesen, wie lange das Subquery braucht, dieses wird nämlich für jede Zeile in "beitrag" einmal ausgeführt.

    „dependent subquery“ ist das Stichwort.

    Die MySQL-Doku bietet bereits einen Artikel für Optimierung derartiger Probleme: http://dev.mysql.com/doc/refman/5.0/en/subquery-optimization-with-exists.html

    Viel mehr kann ich dir auch nicht sagen, das ist ein Fall für die MySQL-Gurus.

    --
    “All right, then, I'll go to hell.” – Huck Finn
  2. Hi,

    WO habe ich den meinen Fehler, der das alles so verlangsamt?

    Die erste und pauschale Rückfrage bei solchen Fragen:

    Welche Indexe hast du gesetzt, und was sagt EXPLAIN über dein Statement?

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/