2012-04-19 3 views
0

Проблема: сотни идентичных (схем) таблиц. Некоторые из них имеют некоторые дублированные данные, которые необходимо удалить. Моя обычная стратегия для этого:mysql: удаление дубликатов при избежании таймаута клиента

walk list of tables - for each do 
create temp table with unique key on all fields 
insert ignore select * from old table 
truncate original table 
insert select * back into original table 
drop or clean temp table 

Для небольших столов это прекрасно работает. К сожалению, таблицы, которые я убираю, часто содержат 100 миллионов миллионов записей, поэтому мои задания и клиентские соединения выходят из строя, пока я выполняю это. (Так как есть сотни этих таблиц, я использую Perl для просмотра списка и очистки каждого из них. Здесь происходит тайм-аут).

Некоторые опции я ищу в:

туздЫшпр - быстрый, но я не вижу, как сделать последующее «вставить игнорировать» шаг

в выходной файл/нагрузка входной_файл - также быстро, но Я запускаюсь с удаленного хоста, а «в outfile» создает все файлы на сервере mysql. Трудно почистить.

выполните вставку/выбор в блоках из 100 тыс. Записей - это позволит избежать тайм-аута db, но его довольно медленно.

Я уверен, что есть лучший способ. Предложения?

+0

[Возможно, это должно помочь.] (Http://stackoverflow.com/questions/2385921/deleting-duplicates-from-a-large-table) – tuxuday

+0

Изначально попробуйте маршрут «alter ignore», но я уверен, что мои связи будет таймаут, прежде чем он закончится. – ethrbunny

ответ

0

Если SQL-запрос для поиска дубликатов может завершиться без тайм-аута, я думаю, вы должны иметь возможность делать SELECT с помощью оператора Count() с предложением WHERE, которое ограничивает вывод только строками с дублирующимися данными (Count (DUPEDATA)> 1). Результаты этого SELECT можно поместить во временную таблицу, которая затем может быть объединена с основной таблицей для запроса DELETE.

В этом подходе используются силовые установки SQL/MySQL - нет необходимости в кодировании Perl.

+0

Я думаю, это проблема - любой select * будет тайм-аут. И мне нужно знать все столбцы, чтобы найти дубликаты. – ethrbunny

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