Vinzenz Mai: Query optimieren / mysql 5

Beitrag lesen

Hallo,

SELECT

node.payload
FROM
    000node node
WHERE
    node.lft BETWEEN (SELECT
                          parent.lft
                      FROM
                          000node parent
                      WHERE
                          parent.payload = 5895
                      )
             AND     (SELECT
                          parent.rgt
                      FROM
                          000node parent
                      WHERE
                          parent.payload = 5895
                      )

  

> in der Hoffnung, dass der Optimizer merkt, dass er die Subselects nur einmal auszuführen braucht (und zwei Subselects, wo mir eines lieber wäre, aber mir fällt gerade nichts ein, womit ich dieses umgehen könnte).  
  
mit einem Join auf ein Subselect könnte ich es in der Tat umgehen :-)  
  
~~~sql
SELECT  
    node.payload  
FROM  
    000node node  
INNER JOIN (  
    SELECT  
        lft,  
        rgt  
    FROM  
        000node  
    WHERE  
        payload = 5895  
) parent  
ON  
    node.lft BETWEEN parent.lft AND parent.rgt  

Wiederum geht es ausschließlich darum, dem Query-Optimizer "von Hand" beizubringen, dass er aus "parent" nur einen einzigen Datensatz zu berücksichtigen braucht. Dieser Datensatz solle über einen Index effizient zu finden sein und die Auswahl der zurückzuliefernden Datensätze der Gesamtquery sollte mit Hilfe eines Indexes über die Spalte lft ebenfalls sehr performant erfolgen.

Freundliche Grüße

Vinzenz