2013-10-28 2 views
0

Я использую этот запрос для удаления уникальных записей из одной таблицы.SUbstiute для SubQuery для удаления записей из таблицы

DELETE FROM TABLE 1 WHERE ID NOT IN (SELECT ID form TABLE 2) 

Но проблема в том, что обе таблицы имеют миллионы записей и использование подзапроса будет очень медленным.

Может ли кто-нибудь сказать мне какую-либо альтернативу.

+0

Зависит от вашей стратегии индексирования. – eggyal

ответ

1
Delete t1 
from table_1 t1 
left join table_2 t2 on t1.id = t2.id 
where t2.id is null 
+1

Не оптимизирует ли MySQL 'NOT IN' анти-объединения так же эффективно, как' OUTER JOIN/IS NULL'? См. Анализ [@ Quassnoi] (http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/): «* Алгоритмы на самом деле то же самое ... и запросы завершаются в одно и то же время. * ". – eggyal

0

SubQuery действительно медленный infact joins существует!

DELETE table1 
FROM table1 LEFT JOIN table2 ON table1.id = table2.id 
WHERE table2.id is null 
0

Удаление миллионов записей из таблицы всегда имеет проблемы с производительностью; вам нужно проверить, если таблица имеет - 1. Ограничения 2. Триггеры, & 3. Индексы

на нем. Эти вещи сделают ваше удаление еще медленнее ...

Пожалуйста, отключите их перед этим действием. Вы также должны проверить соотношение записей «для удаления» на весь объем таблицы. Если количество удаляемых записей составляет более 50% от всего объема таблицы, то вы должны рассмотреть подход ниже:

  1. Создайте временную таблицу, содержащую записи, которые вы хотите сохранить из исходной таблицы.
  2. Оставьте исходную таблицу.
  3. Переименуйте временную таблицу в исходную таблицу.

Прежде чем перейти к вышеуказанному подходу, убедитесь, что у вас есть копия определения каждого из объектов, зависящих от этой исходной таблицы, таких как ограничения, индексы, триггеры и т. Д. Вам также может потребоваться проверить, в таблице, которую вы собираетесь удалить, есть дети.

Как только это действие будет завершено, вы сможете снова включить ограничения, индексы, триггеры!

Спасибо, Адитья

+0

Будьте осторожны при отключении индексов: некоторые из них могут значительно ускорить эту операцию. Также будьте осторожны при отключении ограничений и триггеров: они могут быть необходимы для обеспечения согласованности данных. – eggyal

+0

Спасибо за комментарий. Глядя на вопрос, я предполагал, что пользователь хочет удалить миллионы записей и удалить такой огромный объем, не происходит каждый день. Именно по этой причине я предположил, что это одноразовая деятельность, и предложил отключить индексы и ограничения –

+0

Но индексы на 'id' в соответствующих таблицах будет * драматическая * помощь. Отключение этих индексов было бы ужасной идеей. – eggyal

Смежные вопросы