A partir d'un certain nombre d'enregistrements, le IN
prédicat sur un SELECT
devient plus rapide que cela sur une liste de constantes.
Voir cet article sur mon blog pour comparer les performances :
Si la colonne utilisée dans la requête dans le IN
la clause est indexée, comme ceci :
SELECT *
FROM table1
WHERE unindexed_column IN
(
SELECT indexed_column
FROM table2
)
, alors cette requête est juste optimisée pour un EXISTS
(qui n'utilise qu'une seule entrée pour chaque enregistrement de table1
)
Malheureusement, MySQL
n'est pas capable de faire HASH SEMI JOIN
ou MERGE SEMI JOIN
qui sont encore plus efficaces (surtout si les deux colonnes sont indexées).