Sélectionnez ... où foo_id dans (select id de ...) Efficacité [fermé]
-
27-10-2019 - |
Question
i) Entre ces deux dont l'un est plus efficace:
Select A.* from A, B where A.b_id = B.id
ou
Select A.* from A where A.b_id in (select id from B);
ii) Comment Select A.* from A where A.b_id in (select id from B);
fonctionne vraiment? Est-il traduit en interne dans quelque chose comme Select A.* from A, B where A.b_id = B.id
ou est (select id from B)
évaluée pour chaque ligne de A?
La solution
Vous pouvez consulter cet article court: http://www.mysqlperformanceblog.com/2010/ 10/25 / mysql-limites-partie-3-sous-requêtes /
Autres conseils
Celui-ci est plus efficace:
Select A.* from A, B where A.b_id = B.id
Oui, fonctionne Select A.* from A where A.b_id in (select id from B)
.
Et, non, (select id from B)
n'est pas évaluée pour chaque ligne. Il est évalué qu'une seule fois.
Normalement, REJOINT sont plus rapides que d'utiliser l'opérateur IN
.
Je ne sais pas où ce genre de faux-jointures viennent, mais vous devez joindre des tables en utilisant ON
, pas une masse de où est à la fin.
SELECT A.*
FROM A
INNER JOIN B ON (A.b_id = B.id)
Cela dépend de divers facteurs, y compris la version MySQL, la taille des tables, l'existence d'un index, etc.
Vous devriez essayer d'exécuter EXPLAIN ...
, ou encore mieux si pris en charge, EXPLAIN EXTENDED ...
suivie SHOW WARNIGS;
pour essayer de comprendre ce que MySQL est en train de faire.