52 votes

Mysql select where not in table

J'ai 2 tables (A et B) avec les mêmes clés primaires. Je veux sélectionner toutes les lignes qui sont dans A et pas dans B. La méthode suivante fonctionne :

select * from A where not exists (select * from B where A.pk=B.pk);

Cependant, cela semble assez mauvais (~2 sec sur seulement 100k lignes dans A et 3-10k moins dans B).

Y a-t-il une meilleure façon de procéder ? Peut-être en tant que jointure gauche ?

select * from A left join B on A.x=B.y where B.y is null;

Sur mes données, cela semble fonctionner légèrement plus vite (~10%) mais qu'en est-il en général ?

55voto

Nick Berardi Points 31361

Je pense que votre dernière déclaration est la meilleure solution. Vous pouvez aussi essayer

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null

35voto

Bill Karwin Points 204877

J'utilise des requêtes au format de votre deuxième exemple. Une jointure est généralement plus évolutive qu'une sous-requête corrélée.

2voto

Dave Rix Points 955

J'utilise également des jointures gauches avec un critère de type "where table2.id is null".

Cela semble certainement plus efficace que l'option des requêtes imbriquées.

2voto

Chosun Points 171

Les jointures sont généralement plus rapides (dans MySQL), mais vous devez également tenir compte de votre schéma d'indexation si vous trouvez qu'il est encore lent. En général, tout champ configuré comme une clé étrangère (en utilisant INNODB) aura déjà un index défini. Si vous utilisez MYISAM, assurez-vous que toutes les colonnes de l'instruction ON sont indexées, et envisagez également d'utiliser toutes les colonnes de la clause WHERE.

-2voto

user3136147 Points 17

Cela m'a beaucoup aidé. Joins sont toujours plus rapides que les sous-requêtes pour donner des résultats :

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X