Вы должны создать временную таблицу следующим образом:
CREATE TABLE temp (id INT NOT NULL PRIMARY KEY) ENGINE MEMORY;
, заполните его значениями, которые вы ищете (2
и 3
в вашем примере):
INSERT
INTO temp
VALUES (3), (4)
и выполните этот запрос:
SELECT ad.id1
FROM (
SELECT DISTINCT id1
FROM a
) ad
WHERE NOT EXISTS
(
SELECT NULL
FROM temp
WHERE NOT EXISTS
(
SELECT NULL
FROM a
WHERE a.id1 = ad.id1
AND a.id2 = temp.id
)
)
Вы должны создать составной индекс на (id1, id2)
, чтобы это работало.
Для каждого id1
это будет проверять каждый id2
против temp
не более одного раза и будет возвращать false, как только будет найден первый id2
, отсутствующий в temp
для каждого id1
.
Вот план запроса:
1, 'PRIMARY', '<derived2>', 'ALL', '', '', '', '', 2, 'Using where'
3, 'DEPENDENT SUBQUERY', 'temp', 'ALL', '', '', '', '', 2, 'Using where'
4, 'DEPENDENT SUBQUERY', 'a', 'eq_ref', 'PRIMARY', 'PRIMARY', '8', 'ad.id1,test.temp.id', 1, 'Using index'
2, 'DERIVED', 'a', 'range', '', 'PRIMARY', '4', '', 3, 'Using index for group-by'
, нет temporary
, нет filesort
.