Почему не работает операция MYSQL "NOT IN" на 100 миллионах записей?
Я пытаюсь получить все строки из таблицы Tabl1, которые недоступны в таблице 2 с помощью запроса NOT IN MSQL. Но я получаю исключение тайм-аута, и запрос не выполняется. Ниже приведен запрос MySQL, который я использую.
SELECT * FROM identity WHERE
unique_id NOT IN (SELECT Message_Queue.index FROM Message_Queue);
Может ли кто-нибудь сказать, пожалуйста, причину или каким-либо другим способом для замены операции NOT IN?
2 ответа
Решение
Когда у вас так много записей в in()
пункт, то вы должны использовать join
вместо
SELECT t1.*
FROM table1 t1
left join table2 t2 on t2.myId = t1.myId
where t2.myId is null
Потому что в MySQL
NOT IN
менее производительный, попробуйте использовать EXISTS
SELECT *
FROM identity a
WHERE NOT EXISTS
(
SELECT null
FROM Message_Queue b
WHERE b.index = a.unique_id
);
Вы также должны поместить индекс в эти столбцы.