Удалить совпадающие записи в двух больших таблицах MySQL - PullRequest
2 голосов
/ 05 мая 2011

У меня есть 2 таблицы MySQL: t1 и t2, которые составляют 1M и 15M строк соответственно.Таблица t1 имеет только 1 поле: «tel» и t2 имеет много полей, но также имеет поле «tel».То, что я хочу сделать, довольно просто: удалить все строки в t1, которые существуют в t2:

DELETE FROM t1 WHERE t1.tel IN (SELECT tel FROM t2)

Проблема в том, что этот запрос, похоже, не завершен.Я запустил его на 8-ядерной рабочей станции Xeon и через 2 дня решил остановить его и искать альтернативы.Я также попытался создать новую таблицу (tt1) и использовать LEFT OUTER JOIN, чтобы вставить только строки из t2, которые не находятся в t1, но, кажется, это занимает столько же времени.Поле 'tel' в t1 является первичным ключом, а это уникальный ключ в t2 (я также пробовал CREATE INDEX t2tel ON t2 (tel), но это не помогло).

Есть предложения?Я подумываю написать программу на C # для загрузки обеих таблиц в упорядоченные массивы или хэши и сделать это с помощью кода ... Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 05 мая 2011
DELETE t1 
  FROM t1
 INNER 
  JOIN t2 
    ON t1.tel = t2.tel;

Это должно быть значительно быстрее, чем при использовании подзапроса.Существует довольно много шагов, которые вы могли бы предпринять, чтобы оптимизировать свой экземпляр MySQL, если он еще не оптимизирован, для больших таблиц.Обильные ключевые буферы - хорошее начало.Есть много других шагов, вам лучше всего воспользоваться настройкой производительности Google для MySQL.

0 голосов
/ 05 мая 2011

проблема с производительностью, я думаю, это потому, что вы используете запрос внутри запроса, вам лучше использовать соединения, я сделал тест с двумя простыми и маленькими таблицами и использовал это:

DELETE t1 FROM t1 inner join t2 on t1.id = t2.t1_id;

Это сработало для меня, надеюсь, это поможет вам.

...