Rolf B: MySQL Explain Speed Problem

Beitrag lesen

Hallo mixmastertobsi,

mich hat kurz der Spaltenname attribut in der artikel_attribut_value verwirrt - da steht eine Attributnummer drin, ja? Warum hast Du die Spalte nicht attributnr benannt, so wie in artikel_attribut_name?

Hast Du da eine IN Klausel mit 1231 Artikelnummern??? Und sehe ich es richtig, dass nur eine einzige davon in der Artikeltabelle vorhanden AND available ist? Anders kann ich mir in den Zeilen 2 und 3 den Wert für rows nicht erklären.

Was ich an deinem Datenmodell nicht ganz verstehe, ist die Aufteilung in artikel_attribut_name und artikel_attribut_value. Entweder hat man eine feste Liste von Attributnamen, die für alle Artikel gelten. Dann braucht die attribut_name Tabelle keinen Artikelbezug. Oder man hat eine variable Liste von Attributen für jeden Artikel, dann sollte man pro Artikel eine Name-Value Liste in einer einzigen Tabelle führen. Die Trennung in Name und Value hat auf den ersten Blick keinen Vorteil, kostet Dich hier aber ordentlich Join-Aufwand.

Was es mit Materialisierung auf sich hat, steht hier, ich verstehe allerdings auch nicht recht, was er hier materialisiert.

Die Zeilen mit type="ref" könnten Optimierungspotenzial bergen. Du hast auf der artikel_attribut_name Tabelle fünf Indexe liegen, wie es scheint, aber er schafft damit keinen eq_ref Zugriff. Hast Du einen Plan, welche Indexe für welche Query nützlich sind? Hast Du einen Index, der die Spalten anr und attribut als die beiden ersten Spalten enthält? Es hat nämlich oft nur wenig Sinn, wenn man Spalten einzeln indiziert. MYSQL nutzt immer nur einen Index für einen Zugriffsschritt, es kombiniert keine Indexe.

Angesichts der Row-Zahlen verstehe ich aber nicht, warum der Zugriff langsam ist. Wie lange braucht er? Kannst Du die Query mal teilweise ausführen (z.B. nur artikel mit available-Abfrage und IN-Klausel, ohne die Joins)?

Rolf

--
sumpsi - posui - clusi