2010-11-27 6 views
1

ive eu du mal avec cela pendant un certain temps. sa prise de plus de 12 secondes et ne peux pas comprendre pourquoi, il devient beaucoup plus lent que les trois tables ont robe.Très lente requête Mysql SELECT

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 est un index sur ndxz_objects.id et productid

+0

ce qui n'explique (.. your_query_here ..) dire? peut-être le coller ici afin que nous puissions avoir une meilleure idée de l'endroit où la performance va – Jaime

Répondre

1

le ralentissement est dû à la requête imbriquée, car une analyse de table est nécessaire pour chaque media_ref_id = ndxz_objects.id

vous devez créer un index sur media_ref_id et media_order dans la table ndxz_media

i aussi suggère de réécrire la requête avec des jointures et à la place

+0

ceux indexés ont aidé beaucoup 0.0022, drôle j'ai essayé des index sur un mais pas tous les deux avant. – jackjlgregory

0

Je devine que vous avez également besoin, au strict minimum, un index sur ndxz_media.media_ref_id. (J'imagine aussi que c'est de là que vient la colonne media_ref_id, puisque les noms de colonnes ne sont pas clairement définis.)

Le même index devrait probablement inclure media_order en tant que deuxième colonne.

0

la question est presque certainement la sous-requête corrélée , qui est exécuté une fois par ligne, même avec un index de ces requêtes ne sont pas grandes. Je pense que le ci-dessous devrait atteindre les mêmes résultats.

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 

Bien que la requête que vous avez fourni est en fait pas valable de toute façon puisque rprice, media_file, url, title ne sont pas agrégées ou dans le groupe par la clause

+0

inclurait rprice, media_file, url, titre dans l'aide de groupe par la clause? – jackjlgregory

Questions connexes