Utgående från ett visst antal poster, IN
predikat över en SELECT
blir snabbare än så över en lista med konstanter.
Se den här artikeln i min blogg för jämförelse av prestanda:
Om kolumnen som används i frågan i IN
sats indexeras, så här:
SELECT *
FROM table1
WHERE unindexed_column IN
(
SELECT indexed_column
FROM table2
)
, då är den här frågan bara optimerad till en EXISTS
(som använder endast en post för varje post från table1
)
Tyvärr, MySQL
är inte kapabel att göra HASH SEMI JOIN
eller MERGE SEMI JOIN
som är ännu mer effektiva (särskilt om båda kolumnerna är indexerade).