mixmastertobsi: MySQL Unterabfrage Korrelierte

Hallo,

ich versuche mich gerade an einer korrelierte Unterabfrage, mit welcher ich mir bessere Performance versprochen habe. Leider braucht diese neue Abfrage länger....an was liegts.

Eigentlich müsste doch die neue Abfrage schneller sein.
In der alten Abfrage wurden pro Artikel noch ca 20 Zeilen aus der Tabelle artikel_attribut geladen. In der neuen nur noch eine...

ALT

  
SELECT * FROM artikel  
JOIN artikel_attribut ON artikel_attribut.anr=artikel.anr  
GROUP BY artikel.anr  

NEU

  
SELECT * FROM artikel  
JOIN artikel_attribut as a1 ON a1.anr=artikel.anr  
WHERE artikel_attribut.preis=(SELECT min(artikel_attribut.preis) FROM artikel_attribut.anr=artikel.anr)  
GROUP BY artikel.anr  

  1. Hi,

    NEU
    SELECT * FROM artikel
    JOIN artikel_attribut as a1 ON a1.anr=artikel.anr
    WHERE artikel_attribut.preis=(SELECT min(artikel_attribut.preis) FROM
    artikel_attribut.anr=artikel.anr)
    GROUP BY artikel.anr

    Du bekommst zwar mit min nur einen Datensatz aus artikel_attribut zurück, dafür rufst Du den select aber bei jedem Datensatz aus artikel auf. Somit wird das langsamer.

    gruß
    emetiel

  2. Hallo,

    ich versuche mich gerade an einer korrelierte Unterabfrage, mit welcher ich mir bessere Performance versprochen habe. Leider braucht diese neue Abfrage länger....an was liegts.

    an MySQL.

    ALT

    SELECT * FROM artikel
    JOIN artikel_attribut ON artikel_attribut.anr=artikel.anr
    GROUP BY artikel.anr

      
    Jedes andere mir bekannte DBMS - außer MySQL - weist diese Abfrage als syntaktisch falsch zurück, bei  
      
    
    > In der alten Abfrage wurden pro Artikel noch ca 20 Zeilen aus der Tabelle artikel\_attribut geladen. In der neuen nur noch eine...  
      
    wie kommst Du auf diese Idee? Bei der alten Abfrage genügt [MySQLs GROUP-BY-Optimierung](http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html) irgendeine Zeile aus artikel\_attribut. Bei der neuen muss es eine ganz bestimmte sein. Kein Wunder, dass das länger dauert.  
      
    Dass es EXPLAIN gibt, [habe ich Dir schon geschrieben](/archiv/2011/4/t204422/#m1384506) ...  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Ja - und seitdem benutze ich auch ständig explain.

      Hmm - aber wie kann ich nun aus der Tabelle artikel_attribut zum Beispiel den niedrigsten Preis ausgeben. Das geht doch nur mit einer Unterabfrage - oder?!?