Vinzenz Mai: MySQL: Auswirkung von Indexen auf die Abfrage-Performance

Beitrag lesen

Hallo,

Ok - mit Indizes habe fast nie gearbeitet (außer bei Fulltext). Welchen Indizes sollte ich denn in meinem Fall verwenden?

Lesetipp: MySQL-Handbuch, Abschnitt "How MySQL Uses Indexes"

wieviele verschiedene Spalten spielen bei dieser Abfrage, so wie hier besprochen eine Rolle? Ganze zwei. Das kann man sogar noch durchprobieren :-)
Ich hab's extra für Dich getan ...

Ich beziehe mich auf Deine Aussage hier im Thread.

In meinem Beispiel dauert die Abfrage 45 Sekunden.

da kannst Du Dich nicht beklagen :-)

Ich habe mir in meinem Testsystem (Intel Atom) eine Beispieltabelle mit den beiden angegebenen Spalten erstellt, ca. 10000 Datensätze mit 250 verschiedenen Artikeln, etwa 1800 Aufträgen und zwischen 1 und 10 Artikeln je Auftrag.

Hinweis: vor jeder einzelnen Abfrage habe ich per

RESET QUERY CACHE

den Query-Cache gelöscht.

Dauer der Abfrage, wenn keine Indexe vorhanden sind, 9 Minuten 48 Sekunden ...

a) Index nur für die Spalte artikel
Dauer der Abfrage ca. 5.7 Sekunden

b) Index nur für Spalte auftragnr
Dauer der Abfrage ca. 1.25 Sekunden

c) zwei Indexe
   Index für Spalte artikel,
   Index für Spalte auftragnr
Dauer der Abfrage ca. 1.25 Sekunden

d) ein kombinierter Index für die Spaltenreihenfolge (auftragnr, artikel)
Dauer der Abfrage ca. 0.30 Sekunden

e) ein kombinierter Index für die Spaltenreihenfolge (artikel, auftragnr)
Dauer der Abfrage ca. 0.45 Sekunden

f) zusätzlich zu d) Einzelindexe für die einzelnen Spalten
Dauer der Abfrage ca. 0.30 Sekunden

g) zusätzlich zu e) Einzelindexe für die einzelnen Spalten
Dauer der Abfrage ca. 0.45 Sekunden

Welchen Index bzw. welche Indexkombination würdest Du für *diese* Abfrage wählen? Lohnen sich _für diese Abfrage_ die Einzelindexe zusätzlich zu einem kombinierten Index?

Warum ist der kombinierte Index (auftragnr, artikel) *bei meinen Daten* lohnender als der kombinierte Index (artikel, auftragnr)?

Welche Hilfe kann Dir dabei EXPLAIN bieten?

Anmerkungen:
Die vorliegenden Daten können den Ausführungsplan beeinflussen.
Interessanterweise führte *bei meinen Daten* der Optimierungshinweis im Handbuch zu IN/=ANY-Subqueries zu kontraproduktiven Ergebnissen, sprich die Ausführungszeit erhöhte sich um ca. 5 bis 15%.

Freundliche Grüße

Vinzenz