Beim aufsetzen des Projektes Islam Archiv war mir wichtig, die Datenbank so klein wie möglich zu halten. Aber jetzt habe ich gelernt, dass man die Datenbank bei so großen Projekten nicht ohne Konsequenzen klein halten kann. Entweder wird man es klein halten oder es mehr belasten. Das wichtige hierbei ist, die Harmonie zu finden und sich nicht zu sehr auf eine Seite zu stürzen.
Datenbank Gleichgewicht herstellen
Ich habe in der Islam Archiv Datenbank folgende Tabellen, die hier wichtig sind:
- parents
- parent_metas
- childs
- child_metas
- grandchilds
- grandchild_metas
- tags
- tag_metas
- tags_junction
Bis jetzt habe ich das so gemacht, dass wenn ein child von der Datenbank geholt wird, automatisch auch mehrere Werte mitgeholt werden. Unter anderem auch die Anzahl der tags_junctions, wo dieser child Datensatz erwähnt wird. Das bedeutet, dass diese Abfrage auf der Koran-Seite 114 mal ausgeführt wird, weil es 114 Suren (childs) gibt. Die Abfrage ist dann in einem Beispiel wie folgt:
SELECT COUNT(DISTINCT tj.tag_id) FROM tags_junction tj INNER JOIN grandchilds gc ON tj.grandchild_id = gc.id WHERE gc.parent_type = "child" AND gc.parent_id = 1
Das hat dann dazu geführt, dass die Datenbank auf dem aktuellen Server sehr ausgelastet wird und entsprechend lange gebraucht hat, bis die Antwort vom Server kam. Das Ergebnis wie folgt:

Die Gesamtladezeit der Webseite betrug beinahe 10 Sekunden:

Das war natürlich unerträglich und nicht ausgeglichen. Das Problem war, dass ich in der tags_junction Tabelle nur die grandchild_id’s gesammelt habe und auf die child_id’s und parent_id’s verzichtet habe. Jetzt habe ich die Spalten child_id und parent_id auch hinzugefügt und befüllen lassen, damit ich am Ende ohne INNER JOIN’s die Datensätze abzählen kann.
Das gleichgewicht besteht hier dabei, dass ich die Tabelle von 3 auf 5 Spalten erhöht habe, im Gegenzug aber die Abfrage um ca. 85 Prozent verkürzt habe. Also von 9,5 Sekunden auf 1,5 Sekunden.