Vinzenz Mai: mysql: Index richtig setzen

Beitrag lesen

Hallo,

ich habe eine Query, die teilweise sehr lange braucht:

select
c.name,
b.ID,
t.Anzahl,
m.Firma,
k.ID,
a.datum,
FROM bestellung b
JOIN Teile t ON b.ID = t.ID
JOIN user c ON ...
JOIN auftraege m ON ...
JOIN kunden k ON...
LEFT JOIN Fzug f on ..
LEFT JOIN Artikel a on (b.ID = a.ID AND t.Artikelnummer = a.Artikelnummer )
WHERE
t.Anzahl > 0 AND
order by ...

  

> Ich denke, dass die Abfrage deshalb lange dauert, weil die Artikeltabelle je nach Kategorie 100.000 Einträge hat. Es dürfte also der LEFT JOIN auf die Artikeltabelle der Engpass sein.  
  
Hast Du das überprüft?  
Einfach Artikeltabelle und entsprechende Spalte weglassen und Ausführungszeit messen.  
  
Hast Du [EXPLAIN](http://dev.mysql.com/doc/refman/5.1/de/explain.html) befragt?  
  

> Wie könnte ein entsprechender Index hier helfen?  
  
Der sich anbietende ist offensichtlich:  
ein kombinierter Index über die Spalten a.ID und a.Artikelnummer, wobei die Reihenfolge eine Rolle spielen kann, siehe [mein Archivbeitrag](/archiv/2011/4/t204422/#m1384506).  
  
Deine Tabellenaliasnamen könnten besser gewählt werden, Spaltennamen auch. Wieso es zu Bestellungen mit Artikeln kommen kann, die in der Artikeltabelle nicht vorhanden sind, leuchtet mir nicht ein - genausowenig, wozu die Spalte "Datum" der Artikeltabelle dienen soll.  
  
Unterabfragen könnten ebenfalls helfen, die Gesamtzahl der vom DBMS zu betrachtenden Datensätze deutlich zu verringern.  
  
  
Freundliche Grüße  
  
Vinzenz