2010-11-27 26 views
1

Ich habe schon eine Weile damit zu kämpfen. es dauert über 12 Sekunden und kann nicht herausfinden, warum, es wird viel langsamer als alle drei Tische haben Kleid.Sehr langsame Mysql SELECT Abfrage

SELECT SUM(quantity), rprice, media_file, url, title 
FROM inventory, ndxz_objects, ndxz_media 
WHERE productid = ndxz_objects.id 
AND media_ref_id = ndxz_objects.id 
AND productid = media_ref_id 
AND media_order = (SELECT MIN(media_order) FROM ndxz_media WHERE media_ref_id = ndxz_objects.id) 
GROUP BY productid 
ORDER BY productid DESC 

Theres ist ein Index auf ndxz_objects.id und productid

+0

was nicht erklärt (.. your_query_here ..) sagen? vielleicht fügen Sie es hier ein, damit wir eine bessere Vorstellung davon bekommen können, wohin die Leistung geht – Jaime

Antwort

1

die Verlangsamung wird durch die verschachtelte Abfrage verursacht, weil ein Tabellenscan für jede erforderlich ist media_ref_id = ndxz_objects.id

Sie brauchen auch einen Index für media_ref_id und auf media_order in der ndxz_media Tabelle

i erstellen vorschlagen, die Abfrage mit Joins stattdessen

+0

jene indexierten geholfen viel 0.0022, lustig ich versuchte Indizes auf einem aber nicht beide vorher. – jackjlgregory

0

Ich vermute, Sie brauchen, auf ein Minimum, um einen Index für ndxz_media.media_ref_id. (Ich nehme auch an, dass hier die media_ref_id-Spalte herkommt, da Sie die Spaltennamen nicht klar definieren.)

Derselbe Index sollte wahrscheinlich media_order als zweite Spalte enthalten.

0

Das Problem ist fast sicher die korrelierte Unterabfrage, die einmal pro Zeile ausgeführt wird, auch mit einem Index solche Abfragen sind nicht groß. Ich denke, dass die folgenden Ergebnisse die gleichen Ergebnisse erzielen sollten.

SELECT SUM(quantity), rprice, media_file, url, title 
FROM inventory, ndxz_objects, ndxz_media, 
(SELECT MIN(media_order) as order FROM ndxz_media GROUP BY media_ref_id) min_orders 
WHERE productid = ndxz_objects.id 
AND media_ref_id = ndxz_objects.id 
AND productid = media_ref_id 
AND media_order = min_orders.order 
GROUP BY productid 
ORDER BY productid DESC 

Obwohl die Abfrage, die Sie eigentlich nicht gültig sowieso da rprice, media_file, url, title vorgesehen ist, werden nicht aggregiert oder in der Gruppe durch Klausel

+0

würde einschließlich rprice, media_file, url, titel in der group by clause help? – jackjlgregory