KlausStein: Query optimieren / mysql 5

Beitrag lesen

Hallo,

im Nachgang an diesen Thread im Mai 1009 habe ich meine Eintragsstruktur über Nested Sets wie in diesem Tutorial beschrieben, abgebildet.

Ein wenig Sorge über die eventuell hohe Performancelastigkeit hatte ich letztes Jahr ja schon, aber es kam keine Antwort und wenn das dann schon in mysql.com als Lösung angeboten wird, wirds schon passen. Dachte ich mir.

Nun, knapp 1,5 Jahre und etwas über 2000 Nodes später, werde ich eines Besseren belehrt und muss mich (und über dieses Forum auch Euch) um eine Lösung folgenden Problemes bemühen:

Bei einem select-Statement erhalte ich folgende Fehlermeldung:

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Die dazugehörige Query:

  
SELECT s.payload, m.spalte5,m.spalte6  
FROM 000node v, 000node s, 000node s_id, threads m  
WHERE s.lft BETWEEN v.lft AND v.rgt  
AND s.payload = m.ID  
AND m.delete != 1  
AND s.root_id =  "2010"  
AND s_id.payload = "5895"  
AND s.lft BETWEEN s_id.lft AND s_id.rgt  
GROUP BY s.lft  

Ehrlich gesagt hoffe ich darauf, die Query selber so abändern zu können, dass sie etwas performanter wird.

Die Tabelle:

node_id|root_id|payload|lft|rgt |
--------------------------------
1      |2009   |2009   |1  |1966|
--------------------------------
2      |2009   |3611   |2  |7   |
---------------------------------
3      |2009   |3614   |3  |6   |
---------------------------------
usw.

(Die root-id ist immer die Jahreszahl, Payload des rootpostings ist gleich der Jahreszahl, die anderen Payloadeinträge entsprechenden der Thread-ID).

Und zu guter Letzt, die Abfrage oben soll alle Kinder und Kindeskinder des Threads 5895 herausfinden. Das funktioniert auch tadellos, wenn nicht 2000 Nodes und 4000 Threads vorhanden sind, sondern nur die Hälfte.

Ich verwende mysql5, wer hilft mir mal auf die Sprünge, wie ich die Abfrage so performant hinbekomme, dass mysql5 nicht meckert?

Grüße, KlausStein