Почему не работает операция 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

Потому что в MySQLNOT IN менее производительный, попробуйте использовать EXISTS

SELECT  * 
FROM    identity a
WHERE   NOT EXISTS
        (
            SELECT  null
            FROM    Message_Queue b
            WHERE   b.index = a.unique_id 
        );

Вы также должны поместить индекс в эти столбцы.

Другие вопросы по тегам