Halihallo Andreas
Es ist eine Unsitte, wenn man beispielsweise so etwas formuliert:
SELECT name, strasse, SUM(wasauchimmer)
FROM tabelle
GROUP BY name
ich muss gestehen dass ich hiermit ein kleines Problemchen habe. Ich will z.B. den Artikelnamen abfragen, mit dem geringsten Preis in der Tabelle. Ich mache das jetzt so:
SELECT Artikelname FROM table ORDER BY Preis LIMIT 1
Jups.
Nur habe ich was gegen ORDER BY, denn wenn ich mich nicht irre ist hierzu ein FullTable-Scan notwendig. Zumindest ist das so wenn ich 2 Datensätze abfragen würde, denn dann muss er alle Werte 'Preis' in der Tabelle miteinander vergleichen. Ich weiß jetzt nicht ob der Query-Optimizer von mySQL den Minimal-Wert auch anderes errechnen kann, ich könnte es mir vorstellen, weiss es aber nicht.
Bei ORDER BY ist leider im Normalfall wesentlich mehr nötig, als ein fulltable-scan.
Zumal er erstens alle auslesen muss (fulltable-scan) und danach noch sortieren muss.
Die Komplexität bzw. Zeitaufwand beträgt nicht nur n (für Anzahl Datensätze), wie beim
Fulltable-scan, sondern gar n*log(n).
Wie du jedoch bereits vermutet hast, kann man in
http://www.mysql.com/doc/en/LIMIT_optimisation.html sehen, dass ein
LIMIT den ORDER BY gar nicht ganz auszuführen braucht, sondern einfach bei LIMIT 1 den
ersten (maximalen, minimalen) Datensatz zurückgibt, ohne alles andere sortieren zu
müssen. Die Komplexität beträgt also n wie beim fulltable-scan. Befindet sich das
Attribut allerdingt im Index ist der grösse bzw. kleinste Wert natürlich innerhalb
eines Festplattenzugriffes gefunden, ggf. ein Zweiter um den Namen des Artikels aus der
Tabelle zu lesen. Der Zeitaufwand für deine Abfrage ist minimal.
Wie formuliert man denn sowas am besten?
So wie du es hast, ist es _sehr_ performant, wenn Preis indiziert ist; noch performanter
wird es IMHO, wenn Artikelname indiziert ist, denn dann muss MySQL lediglich auf den
Index zugreifen, ein selektieren in der MYD (bei MyISAM) bleibt gänzlich aus.
SELECT Artikelname, MIN(Preis) FROM Table
geht das nicht(logisch!). Aber wenn ich jetzt noch ein Gruop BY Artikelname hinzufüge, dann bekomme ich den niedrigsten Preis für jeden Artikel, das ist es ja auch nicht was ich will. Sicher könnte ich da dann auch wie oben Ordnen und limitieren, nur ist das dann am Ende dasselbe.
Nicht ganz. Der Zeitaufwand ist, wenn auch unbedeutend in Verbindung mit LIMIT, grösser.
@Klaus(anderes Posting): Full ACK, hatte ich übersehen (GROUP BY-Klausel).
Viele Grüsse
Philipp
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.