Ab einer bestimmten Anzahl von Datensätzen wird der IN Prädikat über ein SELECT wird schneller als das über eine Liste von Konstanten.
Siehe diesen Artikel in meinem Blog zum Leistungsvergleich:
Wenn die in der Abfrage verwendete Spalte im IN -Klausel wird wie folgt indiziert:
SELECT *
FROM table1
WHERE unindexed_column IN
(
SELECT indexed_column
FROM table2
)
, dann wird diese Abfrage einfach auf ein EXISTS optimiert (die nur einen Eintrag für jeden Datensatz aus table1 verwendet )
Leider MySQL ist nicht in der Lage, HASH SEMI JOIN auszuführen oder MERGE SEMI JOIN die noch effizienter sind (insbesondere wenn beide Spalten indiziert sind).