Удаление дубликатов от большой таблицы

У меня есть вполне большая таблица с 19 000 000 записей, и у меня есть проблема с дублирующимися строками. Существует много подобных вопросов даже здесь в Так, но ни один из них, кажется, не дает мне удовлетворительный ответ. Некоторые вопросы для рассмотрения:

  • Уникальность строки определяется на два столбца, location_id и datetime.
  • Я хотел бы сохранить время выполнения максимально быстро (<1 час).
  • Копирование таблиц не очень выполнимо, поскольку таблица составляет несколько гигабайтов в размере.
  • Никакая потребность волноваться об отношениях.

Как сказано, каждый location_id может иметь только один отличный datetime, и я хотел бы удалить все дублирующиеся экземпляры. Это не имеет значения, какой из них выживает, поскольку данные идентичны.

Какие-либо идеи?

12
задан Tatu Ulmanen 5 March 2010 в 10:13
поделиться

3 ответа

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

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime)

Прежде чем делать это, просто протестируйте сначала с некоторыми выборочными данными... а затем попробуйте это....

Примечание: В версии 5.5 это работает на MyISAM, но не на InnoDB.

16
ответ дан 2 December 2019 в 19:53
поделиться
SELECT *, COUNT(*) AS Count
FROM table
GROUP BY location_id, datetime
HAVING Count > 2
1
ответ дан 2 December 2019 в 19:53
поделиться
UPDATE table SET datetime  = null 
WHERE location_id IN (
SELECT location_id 
FROM table as tableBis
WHERE tableBis.location_id = table.location_id
AND table.datetime > tableBis.datetime)

SELECT * INTO tableCopyWithNoDuplicate FROM table WHERE datetime is not null

DROp TABLE table 

RENAME tableCopyWithNoDuplicate to table

Таким образом, вы сохраняете строку с меньшим временем даты. Я не уверен насчет perf, это зависит от столбца вашей таблицы, вашего сервера и т.д....

0
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: