Wie langsame SQL-Abfrage beschleunigen?
am 19.01.2018 - 10:33 Uhr in
Hallo zusammen,
in einer Drupal 7 Installation möchte ich eine SQL mit db_query durchführen, die für angemeldete User jeweils eine individuelle Liste mit Nodes ausgibt.
Die Abfrage ist ziemlich komplex, schließt natürlich die node-Tabelle mit ein, mehrere Flag-Felder sowie Tabellen einiger selbst geschriebener Module. Nur um eine Hausnummer zu nennen: die node Tabelle hat 40.000 Einträge, die einzelnen CCK-Felder, Flag-Felder und die individuellen Tabellen beinahe ebenso viele. User sind es ca. 2000.
Meine SQL-Abfrage funktioniert, liefert also ein Ergebnis, allerdings dauert die Abfrage 3 Sekunden. Das ist in einer Produktionsumgebung natürlich völlig indiskutabel.
Die Frage ist wie ich das beschleunigt bekomme. Die SQL-Abfrage benötigt eine ganze Reihe von "LEFT JOIN" und die große Datenmenge tut wohl ihr Übriges. Ich meine irgendwo mal gelesen zu haben, dass sich Drupal durch zusätzliche DB Indizes beschleunigen liesse. Hat jemand Erfahrung damit bzw. hat einen anderen Tipp, wie ich die Abfrage beschleunigen könnte.
Danke & Grüße, rhodes
- Anmelden oder Registrieren um Kommentare zu schreiben
mySQL
am 19.01.2018 - 11:01 Uhr
Moin,
klar. Die zusätzliche Anlage spezifischer Indizes ist immer eine Möglichkeit. Dazu musst Du aber den Aufbau der DB und vor allem des Querys sehr gut verstehen und (das ist noch entscheidender) bei einer Datenbank über die Du nicht die volle Hoheit hat ist das keine gute Ide. Denn beim nächsten DB-Update durch D7 verschwienden dise zusätzlichen (individuellen) Änderungen vermutlich wieder. Wenn Du Pech hast fleigt dir dann soga gleich die ganze DB um die Ohren. - Fazit, an der Struktur der Db würde ich an deiner Stelle nichts ändern!
Mit dem leidigen Thema mySQL tuning durfte in mich in meinem letzten Projekt (30+ Programmierer) mehrer Wochen rumschlagen. Im Grunde läuft es immer darauf hinaus die Querys zu optimieren. Ich vermute mal, dass Du die Querys via Views erzeugst? Wenn ja, schau dir das resultierende Query an und schau mal ob Du das optimieren kannst und und führ das direkt über die D7 API aus (wie das geht ist ein eigenes Thema ... aber das schaffst Du schon :).
Ansonsten kannst Du noch schaun ob deine mySQL-Umgebung wirklich genug Speicher hat und die temporären Tabellen (RAM) diese auch nutzen. Da Du hier nicht die Umgebung beschrieben hast, kann ich an dieser Stelle nur diesen allgemeinen Tipp geben. Wenn Du root-Zugriff(shell-Zugriff auf die Installation hast, google mal nach "mysqltuner". Das ist ein Script welches die diversen mySQL-Parameter checkt und Dir Hinweise gibt wie Du durch einfache Einträge in die mysql.ini dem System die Sporen geben kannst.
Das Script liegt hier "http://mysqltuner.com/"... das wird unter Ubuntu installiert via: "wget http://mysqltuner.pl" oder "apt-get install mysqltuner". Ausführung über: "perl mysqltuner.pl"
LG
Peter
PS: Hier schneit es grade richtig hefftig!