Как ускорить запрос с условием WHERE NOT IN?

Добрый день, не могу понять, почему запрос долго выполняется,
имеется таблица в 10 000 записей, следующего вида

id ; computer_name ; hash
1 ; a ; 11
2 ; b ; 22
3 ; b ; 22
4 ; c ; 33
5 ; c ; 34

Задача такая, что из таблицы нужно удалить дубликатные данные, причём дубликаты нужно определять по полям computer_name и хэш вместе

т.е. из примера выше дубликатом являются строки 2 и 3 т.к. у них одинаковые значения обоих полей (computer_name и hash)
а строки 4 и 5 не являются дубликатом, т.к. их hash разный
Причём после удаления нужно оставить только тут строку из группы дубликатов, чей ID максимальный, другими словами в результате нужно получить

1 ; a ; 11
3 ; b ; 22
4 ; c ; 33
5 ; c ; 34

Написал такой запрос:

DELETE FROM table
   WHERE id NOT IN (SELECT MAX(id)
                      FROM table
                     GROUP BY computer_name, hash);


И проблема в том, что на моём примере, таблица содержит 10 000 записей, при это пока дубликатов нет, т.е. все строки уникальны, так вот запрос выполняется 3 минуты, и в результате говорит что ничего не удалено, и это правильно, т.к. нет дубликатов, проблема в том, почем он 3 минуты выполняется :///

Если я делаю запрос

SELECT * FROM table
   WHERE id NOT IN (SELECT MAX(id)
                      FROM table
                     GROUP BY computer_name, hash);


то моментально выполняется :/ Поле id - первичный ключ соответственно с индексом
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
NOT IN очень медленный для такой задачи. Попробуйте заменить его на NOT EXISTS

или

SELECT * FROM table t1
LEFT JOIN (SELECT MAX(id) id
                      FROM table
                     GROUP BY computer_name, hash) t2 
ON t1.id = t2.id
WHERE t2.id IS NULL
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы