У меня есть вполне большая таблица с 19 000 000 записей, и у меня есть проблема с дублирующимися строками. Существует много подобных вопросов даже здесь в Так, но ни один из них, кажется, не дает мне удовлетворительный ответ. Некоторые вопросы для рассмотрения:
location_id
и datetime
.Как сказано, каждый location_id
может иметь только один отличный datetime
, и я хотел бы удалить все дублирующиеся экземпляры. Это не имеет значения, какой из них выживает, поскольку данные идентичны.
Какие-либо идеи?
Я думаю, вы можете использовать этот запрос для удаления дубликатов записей из таблицы
ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime)
Прежде чем делать это, просто протестируйте сначала с некоторыми выборочными данными... а затем попробуйте это....
Примечание: В версии 5.5 это работает на MyISAM, но не на InnoDB.
SELECT *, COUNT(*) AS Count
FROM table
GROUP BY location_id, datetime
HAVING Count > 2
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, это зависит от столбца вашей таблицы, вашего сервера и т.д....