SQL Querys so kompakt wie möglich halten

Setzten sie keine SELECT * FROM Statements ein wenn sie nicht zwingend ALLE informationen benötigen! Natürlich sollten auch unnötigen keine JOINS erstellt werden.

Praxisbeispiel:
Ein Kundenserver viel immer wieder durch schlechte Performance auf. Es handelte sich dabei um eine Forensoftware von Woltlab, welche mit ein paar Hacks erweitert wurde. Insgesammt umfasst die Datenbank an die 1.5 Millionen Posts in 300’000 Threads. Das Datenvolumen der Datenbank lag zu diesem Zeitpunkt bei rund 1.4GB. Zu Stosszeiten waren jeweils an die 250 User und Bots unterwegs..

Ein einfaches

SHOW FULL PROCESSLIST;

auf der mySQL-Konsole brachte folgendes Query mit einer sehr grossen Laufzeit zum vorschein:

SELECT
bb2_threads.*,
bb2_icons.*,
bb2_boards.*,
bb2_users.username as lastposter
FROM bb2_threads
LEFT JOIN bb2_icons USING (iconid)
LEFT JOIN bb2_boards ON (bb2_threads.boardid=bb2_boards.boardid)
LEFT JOIN bb2_users ON (bb2_threads.lastposterid=bb2_users.userid)
WHERE bb2_threads.closed!=3 
ORDER BY bb2_threads.lastposttime DESC LIMIT 0, 5

Dieses Query ermittelt also die 5 aktuellsten Threads sammt Titel, Author und die entsprechenden ID’s für die Verlinkung und zeigt diese infos auf der Startseite an. Das Query hatte unverändert auf der Konsole trotz allen notwendigen Indexen eine Laufzeit von gut 3s – verursacht durch die gigantische Datenmenge und den notwendigen Filesort.

Nachdem ich mich in das Datenbankschema eingearbeitet habe – konnte ich das Query „etwas“ bereinigen:

SELECT
bb2_threads.threadid,
bb2_threads.views,
bb2_threads.lastposterid,
bb2_threads.topic,
bb2_threads.lastposter
FROM bb2_threads
LEFT JOIN bb2_boards ON (bb2_threads.boardid=bb2_boards.boardid)
WHERE bb2_threads.closed!=3 
ORDER BY bb2_threads.lastposttime DESC LIMIT 0, 5

Der Output ist 100% identisch zum Original. Die Abfrage dauert jetzt allerdings nur noch knapp 0.2s!

Nur diese eine Anpassung hatte folgende Auswirkung auf die Serverlast (Ab KW51):
Cacti mySQL Graph

Schlagworte: , , ,

Kommentieren


Social Widgets powered by AB-WebLog.com.