A partir de um certo número de registros, o
IN
predicado sobre um SELECT
torna-se mais rápido do que em uma lista de constantes. Veja este artigo no meu blog para comparação de desempenho:
Se a coluna usada na consulta no
IN
cláusula é indexada, assim:SELECT *
FROM table1
WHERE unindexed_column IN
(
SELECT indexed_column
FROM table2
)
, essa consulta será otimizada apenas para um
EXISTS
(que usa apenas uma entrada para cada registro de table1
) Infelizmente,
MySQL
não é capaz de fazer HASH SEMI JOIN
ou MERGE SEMI JOIN
que são ainda mais eficientes (especialmente se ambas as colunas forem indexadas).