SQL IN/NOT IN
В контексте MySQL на данный момент.
Есть все предпосылки полагать, что красивый и изящный оператор IN / NOT IN в SQL-запросе сильно неэффективен на больших таблицах по сравнению с прямым сравнением значений по индексам и в том числе в операциях INNER / LEFT JOIN, т.к. похоже, что IN / NOT IN действует простым перебором, что сильно удорожает его применение. Здесь грустный вздох.
Но что нехорошо, возможная на первый взгляд полноценная замена выражения, например:
SELECT
table1.param
FROM
table1
WHERE
table1.param NOT IN (
SELECT
table2.param
FROM
table2
WHERE
table2.predicate
)
на:
SELECT DISTINCT
table1.param
FROM
table1
LEFT JOIN
table2
ON
table2.param = table1.param
WHERE
NOT(table2.predicate)
тоже неэффективна, т.к. в отрицании предиката нужно для всех полей, участвующие в нем, дополнительно добавлять проверку на IS NULL, который сам неэффективен по быстродействию.
Единственно остающийся вариант для промышленной замены IN — INNER JOIN временной таблицы.