Недавно столкнулся с задачей удаления дублей записей из таблицы по определенному полю:
К примеру есть таблица 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