Hi!
ich programmiere gerade ein kleines Geschichtenarchiv mit PHP/MYSQL, und habe ein paar Performancefragen.
Grundlegendes Prinzip: Miss die Ausführungszeit all deiner Ideen und vegleiche sie. Es gibt so viele mögliche Fälle, dass theoretische Überlegungen zur Performance nicht immer stimmen müssen. Deswegen ist es nicht günstig, sich für andere Anwendungen blind auf einmalig erarbeitete Vergleiche zu stützen. EXPLAIN hilft (nach Einarbeitung) auch, die Schwachstellen zu erkennen. In der Regel bringen auf die Abfragen zugeschnittene Indexe die größten Performancevorteile. Sie können aber auch bremsen, wenn viele Daten zu ändern sind und der Index zusätzlich immer wieder neu gebaut werden muss.
Zu Performance-Überlegungen ist auch die Anzahl der Daten interessant. Bei zu wenigen Datensätzen ist die Performance vernachlässigbar, weil alle Abfragevarianten im Grundrauschen untergehen. Auch kann es sein, dass das DBMS erst ab einer gewissen Anzahl oder Kardinalität von Datensätzen zu Optimierungen greift, so dass Messergebnisse nicht einfach hochgerechnet werden können.
- Ich möchte eine Liste aller Benutzer und deren Mailadressen haben.
SELECT * FROM Benutzer b, Bernutzermailadressen a WHERE b.uid = a.uid ORDER BY …
ODER sollte ich die beiden Tabellen joinen?
Ist schon gejoint. Das ist die implizite Schreibweise für einen Inner Join. Wenn dir die noch niht bekannt sind, recherchiere die Auswirkungen auf das Ergebnis (nicht die Performance) im Gegensatz zu einem Left Join.
Ich könnte mir aber auch vorstellen ZUERST alle Geschichten herauszuholen und dann 2 einzelne SQLs pro Geschichte zu machen, wo ich aber hörte, dass man lieber einen großen, statt viele kleine machen sollte.
Viele kleine bedeuten viele Roundtrips zum DBMS nebst dem Overhead für das Handling der SQL-Statements. Messen schafft konkrete Klarheit (und erweitert den persönlichen Erfahrungsschatz).
Lo!