Netti: mysql: Index richtig setzen

Hi,

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.

Wie könnte ein entsprechender Index hier helfen?

Gruß in die Runde, Netti

  1. 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
    
    1. Hi Vinzenz,

      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?

      Ja, habe ich. Wenn die Artikeltabelle nicht mit abgefrat wird, ist sie Abfrage sehr schnell.

      Hast Du EXPLAIN befragt?

      Nein. Sollte ich noch machen, stimmt.

      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.

      Es können nicht gelistete Artikel bestellt werden. Die sind dann natürlich nicht in  der Artikeltabelle vorhanden. Das Datum beschreibt lediglich das letzte Aktualisierungsdatum des gelisteten Artikels.

      Unterabfragen könnten ebenfalls helfen, die Gesamtzahl der vom DBMS zu betrachtenden Datensätze deutlich zu verringern.

      Stimmt. Auch diesbzgl. könnte ich ggf. aktualisieren. Welche Angaben bräuchtest Du, um mir dabei ggf. helfen zu können?

      Viele Grüße, Netti

    2. 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.

      »»

      Toller Beitrag und sehr imposante Werte.
      Da würde sich wirklich mal ein feature-Artikel anbieten, mit download-dateien zum "nachprobieren" auf eigenem System!

      Danke für das Post. Ich wußte nicht, dass Indexe so viel bringen!

      Gruß, Netti