Drupal und Indexe in der Datenbank


Wenn man mit Drupal herumspielt muss man sich eigentlich nicht gross um die Datenbank kümmern und wie diese Konfiguriert ist. Aber eben nur "nicht wirklich". Falls es auf Performance ankommt, muss man sich sehr wohl darum kümmern. Hier das Szenario:

Ein Nodetyp Kapitel und ein Nodetyp Zusammenfassung. Die Zusammenfassungen können von registrierten Benützern erstellt werden und werden via nodereference einem Kapitel zugeordnet. Ein Kapitel kann also n Zusammenfassungen haben.

Jetzt möchte man gerne die folgende Liste ausgeben:

"Gib mir alle Kapitel, welche keine Zusammenfassung haben." Klingt trivial ist es aber nicht ganz: Es muss ein Join über das node_reference Feld gemacht werden, und überall dort, wo es kein Resultat gibt, muss es ausgegeben werden. Query lässt sich mit Subquerys lösen (das ganze Szenario war noch ein wenig komplizierter, aber zur Veranschaulichung reicht es).

Gut, Query ausführen: Dauer ca. 15 Sekunden. Query umschreiben und optimieren: Nur noch 7 Sekunden. Ist einfach noch immer viel zu langsam, was dazu führt, dass die Leute immer mal wieder die Refreshtaste klicken, was den DB Server in die Knie zwingt.

Es stellt sich natürlich die grosse Frage, wo wohl das Problem liegt. Nach vielem Nachforschen, war es dann relativ offensichtlich. Auf dem nodereference Feld war kein Index angelegt worden. Ich bin kein DB Experte, aber ein Index ermöglich ein schnelleres darauf Zugreiffen. Legt man in der DB auf diesem Feld einen Index an, dann dauert der Query lediglich noch einige Millisekunden. -> Problem gelöst.

Fazit: Es gibt wahrscheinlich viele Dinge, Drupal zu optimieren. Dazu gehört eine gute Caching Strategie usw. ABER. Indexe am richtigen Ort zu setzen ist einfach Musik in den Ohren: Minimaler Aufwand aber unter Umständen maximale Performance-Steigerung!