2010-08-10 3 views
0

Je cours la requête ci-dessous sur une table avec environ 100k lignes en utilisant un NOT IN et la performance est terrible. Existe-t-il un autre moyen d'atteindre le même résultat?MySql NOT IN Problème de performance

SELECT c.Id, c.Name, c.address, c.town, 
c.county, c.postcode, FROM contractor AS c 
inner join Order w 
on w.Id = c.Id WHERE (c.valid = 1) and c.Id not in 
(select w.Id from Order w) ORDER BY c.Name ASC 

Merci

+1

Cette requête ne doit renvoyer aucune ligne. Votre jointure n'obtient que des c.Id qui sont égaux à w.Id (et donc sont IN select w.Id de Order w). De plus, il y a une erreur de syntaxe (le ',' après c.postcode). –

Répondre

0

Personnellement, je ne voir amélioration à votre code, sauf que vous pouvez ajouter l'indexation à vos champs. La règle générale consiste à ajouter un index aux colonnes que vous utilisez dans votre clause WHERE.

2

Vous semblez avoir une jointure interne redondante à Order.
Je crois que la requête suivante donnerait les mêmes résultats et pourrait améliorer les performances.

SELECT c.Id 
     , c.Name 
     , c.address 
     , c.town 
     , c.county 
     , c.postcode 
FROM contractor AS c 
     left outer join Order w on w.Id = c.Id 
WHERE (c.valid = 1) 
     and w.Id IS NULL 
ORDER BY 
     c.Name ASC 
+0

Je pense que c'est ce que le TS voulait, +1. –

+0

Salut, Merci pour votre suggestion. Malheureusement, il continue de tourner pendant que je parle (2-3 minutes) ... Y a-t-il un moyen d'utiliser un NOT EXISTS? – user357535

+1

C'est probablement lent parce que vous n'avez pas indexé vos colonnes. Mettez un index sur la colonne c.Id et w.Id et vous devriez être prêt à partir. –