Einzelnen Beitrag anzeigen
  #10  
Alt 29.10.2010, 08:00:34
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: COUNT mit JOINs und sub-queries kriechend langsam

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
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten