mySQL и удаление дубликатов

[Удален]
3853

Друзья, приветствую! Нужна помощь. Дело в следующем:

В моей таблице (Mysql) более 600 тысяч записей. Как мне не уронив сервак, почистить дубликаты? Может как-то с задержками через php? Есть мысли? Очень надо.. С наступающим праздником!

[Удален]
#1

дубликаты чего? записей? какие задержки, это одним запросом делается если в таблице есть primary key

DELETE FROM `table` t1 WHERE EXISTS (SELECT `field` from `table` t2 WHERE `t1`.`field`=`t2`.`field` AND `t1`.`id`!=`t2`.`id`)

где field - поле, уникальность которого надо достичь, а id это Primary key

Более быстрый вариант с self-joinом но может памяти не хватить запросто

N
На сайте с 06.05.2007
Offline
419
#2

limit можно писать не только в select, но и в update. подавайте потихонечку серию запросов на обновление с limit и все получится.

Кнопка вызова админа ()
[Удален]
#3
netwind:
limit можно писать не только в select, но и в update. подавайте потихонечку серию запросов на обновление с limit и все получится.

Я тут умудрился запросом "delete from t using links t, links t2 where t.l_url LIKE t2.l_url and t.l_url = t2.l_url" положить mysql у провайдера ;) К этому запросу лимит можно использовать?

N
На сайте с 06.05.2007
Offline
419
#4

здесь, пожалуй, нет смысла.

у вас ведь есть первичный ключ на этих таблицах?

выбирайте "окно" в таблице на основе этого ключа : пусть предыдущий предыдущий id это начало окна. нужно отступить N записей вперед по order by и узнать конец "окна".

полученные ключи использовать как дополнительные ограничения в t, а объединять для поиска со всей таблицей без ограничений.

Если и эта нагрузка неудовлетворительная, придется во вложенном цикле такое же окно применять ко второй таблице

kil
На сайте с 03.04.2006
Offline
84
kil
#5

А может лучше выбрать только уникальные и перекинуть во временную БД? Ну потом можно из исходной стереть всё и залить в неё то, что получилось? :)

edogs software
На сайте с 15.12.2005
Offline
775
#6
asamakin:
Друзья, приветствую! Нужна помощь. Дело в следующем:
В моей таблице (Mysql) более 600 тысяч записей. Как мне не уронив сервак, почистить дубликаты? Может как-то с задержками через php? Есть мысли? Очень надо.. С наступающим праздником!

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

ALTER ignore TABLE `tablename` ADD UNIQUE ( `field1` ,`field2`  ) 

для удаления дубликатов из базы. В данном примере оставляются только те записи, в которых field1, field2 уникальные. То же можно сделать по 1 полю или по нескольким.

Лучше делать это на отдельной таблице, что бы во время альтерения не было других запросов. Способ самый шустрый из возможных.

Вариант через php конечно возможен. Но он медленен, печален и достаточно очевиден. Выбираете последовательно по 1000 записей из старой БД и вставляете в новую. Для простоты в новой можно создать unique индекс по нужным полям, что бы не париться лишний раз с проверками на возможность вставки.

P.S.: Варианты вида select join - просто ужасны и скорее всего однозначно положат базу на больших таблицах. Такие варианты годятся неплохо для нескольких таблиц, но для одной это просто страшный overkill

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий