Datenbanken: Intelligentes Indexieren

Heute hat mich ein Hosting-Kunde angerufen, sein Website (speziell sein Newsbereich) würde so langsam laden. Die Website wurde eigentlich von jemand anderen erstellt, aber ich hab trotzdem zugesagt, mir das anzusehen.

Mir ist dann relativ schnell aufgefallen, dass es an der Abfrage der Newsartikel liegt. Es gab eine Tabelle für die Newsartikel und eine für die Kommentare. Um eine Übersicht aller Newsartikel mitsamt Anzahl der Kommentare zu bekommen, wurde eine Abfrage auf die beiden Tabellen gejoined durchführt – mit count() für die Kommentartabelle. Soweit nichts neues.

Das Problem war, dass es verhältnismäßig viele Kommentare gab. Etwa 100 Newsartikel standen 15.000 Kommentare gegenüber. Dies führte dazu, dass die Abfrage und das summieren der Kommentare so lange (bis zu 30 Sekunden) dauerte.

Ein simpler Index auf die Spalte der Kommentartabelle, in der die id’s des Newsbeitrages gespeichert sind, reichte aus um das wieder grade zu rücken. Danach lief die Abfrage wieder blitzschnell.

Zugegeben: Das ist alles nichts neues. Jeder, der sich ausführlich mit Datenbanken beschäftigt weiß das alles. Dennoch war das ein Anlass für mich, mal wieder über Indexes nachzudenken. Und darüber, wie oft man nicht daran denkt, zukunftsträchtige Indexes zu setzen, weil es in der Testphase mit 5 Zeilen oft schlicht nicht auffällt.