Schlagwort-Archiv: MySQL Optimierung Limit

MySQL-Optimierungen die Zweite

Heute geht es um die Beschleunigung von Abfragen. Natürlich gibt es auch in diesem Themenbereich viele unterschiedliche Möglichkeiten, weshalb ich nur eine sehr kleine Auswahl darstelle:

MySQL-LIMIT

SELECT firstname, lastname
FROM user
LIMIT 1000, 1000;

Stellen wir uns vor, es sollen alle Vor- und Nachnamen in Tausender-Schritten aus der Datenbank gezogen werden.
Man kann dazu – wie im obigen Beispiel – zwei Parameter für LIMIT nutzen. Offset und RowCount. Das funktioniert soweit ganz gut. Solange jedenfalls, bis die Tabellen größer werden. Dann kann der Offset-Parameter zur echten Bremse werden.
Besser ist es dann, wenn man sich softwareseitig einfach den letzten maximalen Primärschlüssel zwischenspeichert und die Abfrage, dann wiefolgt ändert:

SELECT firstname, lastname
FROM user
WHERE id > 1000
LIMIT 1000;

Nun kann es natürlich geschehen, dass id’s gelöscht werden. Daher muss man sich auch die letzte ID merken und nicht einfach immer den Wert 1000 „draufrechnen“. Durch die Umstellung kann man deutlich schnellere Abfragen erreichen. Da auf der Primärschlüsselspalte ein Index liegt, fällt MySQL die Suche nach der nächstgrößeren ID leicht.

Subqueries statt Joins

Joins resultieren oft in temporären Tabellen, was ein EXPLAIN EXTEND schnell verraten kann:

EXPLAIN EXTENDED SELECT ... JOIN ...

Das Resultat lautet oftmals: Using temporary

Using temporary bedeutet leider einen ziemlichen Performanceverlust bei einer großen Datenmenge. Besser ist es dann, man nutzt ein Subquery:

 

EXPLAIN EXTENDED SELECT (SELECT b.myfield
                         FROM b
                         WHERE b.id = a.foreignKey) ...
                 FROM a

Für die Subqueries steht dann wieder ein Index bereit, der die Sache beschleunigt. Die lästige temporäre Tabelle fällt dann einfach weg und die Abfragen gehen zügig voran 😉