2012-08-14 2 views
2

J'ai cette sélection ici:MySql et sous-sélection, pourquoi est-ce si lent?

select parent_id from sales_flat_order_status_history where status like '%whatever%' group by parent_id having count(parent_id) > 1 

Cette requête ne fonctionne que quelques secondes. Maintenant, je veux l'utiliser dans une autre sélection, comme ceci:

select increment_id from sales_flat_order where entity_id in(
select parent_id from sales_flat_order_status_history where status like '%whatever%' group by parent_id having count(parent_id) > 1) 

Cela va pour toujours, alors j'ai essayé d'insérer les ids un par un:

select increment_id from sales_flat_order where entity_id in(329,523,756,761,763,984,1126,1400,1472,2593,3175,3594,3937,...) 

Cela va vite, où est la différence et comment puis-je faire fonctionner ma première approche plus rapidement?

Merci!

Répondre

3

Votre requête est longue à exécuter car elle exécute la sous-requête et effectue une recherche pour chaque table sales_flat_order de ligne.

Une jointure sera probablement plus rapide:

select increment_id 
from sales_flat_order 
    inner join (select parent_id 
       from sales_flat_order_status_history 
       where status like '%whatever%' 
       group by parent_id having count(parent_id) > 1) Sub 
    on sales_flat_order.entity_id = Sub.parent_ID 

Cette force le sous-requête pour exécuter une seule fois

+0

Oui, beaucoup plus vite en effet! Merci – user1540714

1

Les sous-requêtes sont traitées dans le style foreach (pour chaque ligne, sous-sélection).

Pense comme in (1,2,3) n'utilise pas d'index avec certaines anciennes versions de mysql.

+0

Je ne peux pas faire cela plus vite? – user1540714

Questions connexes