Hallo David,
Wenn MySQL die Spalten ID + DELETED zusammen im Index findet, ist dies schneller, da sich MySQL den Zugriff auf die tatsächliche Basistabelle erspart. I/O werden weniger. Wenn DELETED wenig ausprägungen hat ( nur 0 oder 1), dann ist ein eigener Index auf diese Spalte nahezu wertlos, da die Selektivität/Kardinalität denkbar schlecht ist. Mal abgesehen vom Using index; zugriff, wie ich ihn durch die kombinierten Indices versuche.
Zwischendurch ein paar Kleinigkeiten zur SQL-Abfrage
Was für Werte soll oder kann den DELETED in Zukunft annehmen. Nur 0 ( = FALSE) oder 1 (= TRUE) ? Dann ist es sinnvoll das Prädikat immer auf = abzufragen, also
t1.deleted = 0
a) Bitte mal alle
xx.deleted != '1' Prädikate umschreiben auf
xx.deleted = t1.deleted
alt:
Code:
ON
(
p11.artikleid = t1.id
AND
p11.lang = 'deutsch'
AND
p11.deleted != '1'
)
JOIN
neu:
Code:
ON
(
p11.artikleid = t1.id
AND
p11.lang = 'deutsch'
AND
p11.deleted = t1.deleted
)
JOIN
und DELETED nur einmal füllen.. Deleted ist vom Typ TinyINT. Also kann die Abfrage auch numerisch sein. Dies spart ein Type-Casting.
alt:
Code:
WHERE
t1.deleted != '1'
neu:
Code:
WHERE
t1.deleted = 0
So, nun bitte wieder den EXPLAIN ausführen und den kompletten neuen SQL zeigen (Damit wird immer vom Selben reden).
Grüße
Thomas