dedlfix: MySQL - Query Statement gesucht

Beitrag lesen

echo $begrüßung;

Wie schon gesagt, ich wollte keine Aussage darüber treffen, was da performanter ist

Du hast sicherlich nichts dagegen, wenn ich trotzdem dieses Thema vertiefen möchte. :-)

ich glaube allerdings nicht, dass MAX vs. ORDER BY/LIMIT 1 da einen signifikanten Unterschied macht.

Das käme, so man das wirkliche Verhalten MySQLs nicht kennt, auf einen Versuch an. Ich versuche es zunächst mit Trockenschwimmen:

(Wenn es signifikante Unterschiede gibt werden diese sicherlich erst ab einer bestimmten Datenmenge anfangen, ins Gewicht zu fallen. Bei geringen Datenmengen sollten sie in der Praxis keine Rolle spielen.)

Bei MAX() könnte ich mir zwei Arbeitsweisen vorstellen.
MAX-1: Die Tabelle wird vollständig durchlaufen. Die nicht zutreffenden Datensätze (WHERE) werden ignoriert, von den anderen merkt man sich den bisher höchsten. Kommt ein höherer merkt man sich den.

MAX-2: Zuerst wird eine WHERE-gefilterte Menge angelegt, und dann darin (mittels Durchlaufen und von einer unsortierten Menge ausgehend) der Maximalwert gesucht. Somit müsste zuerst die gesamte Tabelle durchlaufen werden und dann die gefilterte. Außerdem müsste die gefilterte Menge temporär irgendwo abgelegt werden (oder zumindest Zeiger auf die Datensätze, die zu dieser Menge gehören).

MAX-1 halte ich für schneller. MAX-2 läuft nach dem Prinzip, das ich für den allgemeinen MySQL-Fahrplan halte:

  • beteiligte Tabellen heranziehen, ggf. verknüpfen.
  • mit WHERE vorfiltern
  • Gruppieren und Aggregatfunktionen berechnen.
  • HAVING berücksichtigen
  • Sortieren
  • Limitieren
    Nicht vorhandene Klausel müssen natürlich auch nicht berücksitigt werden.

Nach dem Prinzip müsste auch die ORDER/LIMIT-Variante ablaufen. Der Unterschied zu MAX-2 ist, dass die WHERE-gefilterte Menge nicht nur durchlaufen sondern sortiert werden muss. Und dabei stellt sich mir die Frage, die ich an gelernte Informatiker weiterreichen möchte: Was ist schneller, ein Durchlaufen einer Datenmenge oder das Sortieren derselben?

Das Kapitel WHERE Clause Optimization listet einige Optimierungen auf, die MySQL vornimmt. Unter anderem ist zu lesen, dass bei ORDER BY ein Sortieren unterbleiben kann, wenn es bereits einen Index auf der Spalte gibt (wobei so ein Index bei Schreibvorgängen Pflegeaufwand kostet). Welche der drei genannten Varianten weiß diesen Vorteil am besten auszunutzen?

Welche weiteren Optimierungen gibt es für diesen Fall?
(Wo) gibt es einen Dummy-Datenmengengenerator, der eine Testdatenbasis erzeugen kann?

echo "$verabschiedung $name";