Добавил: Amro   Дата: 08.09.2015 10:52

Недавно столкнулся с задачей удаления дублей записей из таблицы по определенному полю:

К примеру есть таблица page_table с полем page_url типа TEXT. И нам нужно уникализировать таблицу по этому полю, т.е. удалить дубли. 

Можно выкрутится используя следующий запрос:

DELETE page_table FROM page_table LEFT JOIN (SELECT max(page_id) as page_id, page_url FROM page_table GROUP BY page_url) t1 USING(page_id) WHERE t1.page_id IS NULL;

Это всё конечно хороше, а как к примеру поступить если у вас поле типа LONGTEXT и в таблице несколько десятков а может и сотен тысяч записей? Как же тогда удалить дубли?

Можно поступить следующим образом:

1) Создать в таблице новую колонку и посчитать там MD5 от поля с типом LONGTEXT

как то так к примеру:

UPDATE sed_pages SET page_extra5 = MD5(page_text) WHERE 1

ну а затем, группируем по этой колонке и лишнее грохаем

DELETE FROM sed_pages WHERE page_id IN ( SELECT * FROM (SELECT page_id FROM sed_pages WHERE 1 GROUP BY page_extra5 HAVING COUNT(*) > 1) AS X);

на таблице с размером в 5Гб первый запрос у меня отработал за 30 сек., второй можно сказать моментально

хотя наверное можно было и так:

DELETE FROM sed_pages WHERE page_id IN ( SELECT * FROM (SELECT page_id FROM sed_pages WHERE 1 GROUP BY MD5(page_text) HAVING COUNT(*) > 1) AS X);

 

comments powered by HyperComments