Mysql sélectionne où pas dans la 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. Les travaux suivants:

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

Cependant, il semble assez mauvais (~ 2 secondes sur seulement 100k lignes en A et 3-10k moins sur B)

Y a-t-il un meilleur moyen de faire fonctionner cela? Peut-être comme une gauche se joindre?

 select * from A left join B on Ax=By where By is null; 

Sur mes données, cela semble être légèrement plus rapide (~ 10%), mais qu’en est-il en général?

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

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

     SELECT A.* from A left join B on Ax = By where By is null 

    J’utilise également des jointures de gauche avec un critère de type “where table2.id is null”.

    Certainement semble être plus efficace que l’option de requête nestede.

    Les jointures sont généralement plus rapides (en MySQL), mais vous devez également tenir compte de votre schéma d’indexation si vous constatez qu’il continue à se déplacer lentement. En règle générale, toute configuration de champ en tant que clé étrangère (utilisant INNODB) aura déjà un ensemble d’index. Si vous utilisez MYISAM, assurez-vous que toutes les colonnes de l’instruction ON sont indexées et envisagez d’append des colonnes dans la clause WHERE à la fin de l’index pour en faire un index de couverture. Cela permet au moteur d’avoir access à toutes les données nécessaires dans l’index, ce qui évite de devoir effectuer un second aller-retour vers les données d’origine. Gardez à l’esprit que cela aura un impact sur la vitesse des insertions / mises à jour / suppressions, mais peut augmenter considérablement la vitesse de la requête.

    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 ;