MySQL-Query ohne Index

Das Optimieren von Datenbank-Abfragen verkürzt deren Ausführungszeit und verbessert den Durchsatz der Abfragen.

Datenbankserver können tausende Abfragen, die zentraler Bestandteil vieler Anwendungen sind, pro Sekunde verarbeiten. Das Optimieren dieser Abfragen verkürzt deren Ausführungszeit und verbessert den Durchsatz der Abfragen.

Für das Beantworten der Abfrage muss der Datenbankserver Daten in Tabellen finden. Hierfür wird idealerweise ein sogenannter Index benutzt, den man sich wie ein geordnetes Stichwortverzeichnis in einem Wörterbuch vorstellen kann. Dieses Stichwortverzeichnis ist im Vergleich zum Wörterbuch sehr klein, verwendet einen binären Suchbaum und durch die alphabetische Ordnung können die Seiten der Wörter schnell gefunden werden. Das Fehlen eines solchen Index kann zur Folge haben, dass alle Reihen der an der Abfrage beteiligten Tabellen durchsucht werden müssen. Da die Indizes im Vergleich sehr klein sind, lohnt es sich (fast) immer, fehlende Indizes gegebenenfalls auch nachträglich anzulegen.

Lösung

Um zu prüfen, wie ein Query ausgeführt ist, können die MySQL-Befehle EXPLAIN bzw. EXPLAIN ANALYZE vor das Query gesetzt werden.

Mit dem Befehl SHOW INDEX FROM #Tabellenname#; ist es möglich, zu prüfen, welche Indizes aktuell für eine Tabelle vorhanden sind.

Wenn das Ergebnis zeigt, dass hier ein Index eingefügt werden kann, kann dieser mit dem CREATE INDEXBefehl erzeugt werden. Das Ergebnis der MySQL-Abfragen verändert sich durch vorhandene Indizes nicht. Sie können daher auch ohne weiteres für Anwendungen, die extern entwickelt wurden, einen Index einfügen.


Um MySQL-Queries, die optimiert werden können, zu finden, kann der Einsatz eines Profilers hilfreich sein. So sollte besonders bei Queries, die eine lange Ausführungszeit haben, geprüft werden, ob hier für alle Tabellen ein Index verwendet wird.


Auch aus dem MySQL Performance Schema lässt sich ermitteln, welche Queries ohne Index ausgeführt werden. Hierfür kann folgender Befehl verwendet werden:

SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, SUM_TIMER_WAIT/1000000000000 SUM_TIMER_WAIT_SEC FROM performance_schema.events_statements_summary_by_digest where last_seen > (date(now()) - Interval - 5 minute) AND SCHEMA_NAME IS NOT NULL AND SCHEMA_NAME NOT IN('information_schema', 'mysql', 'performance_schema') and DIGEST_TEXT not like 'SHOW%' AND SUM_NO_INDEX_USED > 0 order by (sum_timer_wait_sec) desc limit 5 \G


Unser Tool ShopPerformance kann ebenfalls entsprechende Queries anzeigen.

 

Bei Fragen steht Ihnen unser Support telefonisch unter 05251/414130 oder per E-Mail an support@maxcluster.de zur Verfügung.

Veröffentlicht am 07.03.2024