A partire da un certo numero di record, il IN
predicato su un SELECT
diventa più veloce di quello su un elenco di costanti.
Vedi questo articolo nel mio blog per il confronto delle prestazioni:
Se la colonna utilizzata nella query in IN
la clausola è indicizzata, in questo modo:
SELECT *
FROM table1
WHERE unindexed_column IN
(
SELECT indexed_column
FROM table2
)
, quindi questa query è solo ottimizzata per un EXISTS
(che usa solo una voce per ogni record da table1
)
Sfortunatamente, MySQL
non è in grado di eseguire HASH SEMI JOIN
o MERGE SEMI JOIN
che sono ancora più efficienti (soprattutto se entrambe le colonne sono indicizzate).