Удалить дубли строк mysql 100 Гб, 1 миллиард строк, 30% повторов

Статус
В этой теме нельзя размещать новые ответы.
Оппа, а вот DISTINCT тут лишний
Так как я понимаю суть, что у DISTINCT, что у INSERT IGNORE INTO SELECT * FROM T с уникальным ключом одна.
Они каждую новую строку перебирают по индексу на предмет уникальности.
Просто DISTINCT сам создаёт временную таблицу с уникальным ключом.
ALTER IGNORE TABLE nTable ADD UNIQUE (nKey)
На поле с типом TEXT вроде как нельзя применить атрибут UNIQUE
 
Так как я понимаю суть, что у DISTINCT, что у INSERT IGNORE INTO SELECT * FROM T с уникальным ключом одна.
Логика одна и та же скорость может различатся, эксперимент по скорости надо ставить на конкретном железе и софте - от них тоже, как ни странно, зависит.

На поле с типом TEXT вроде как нельзя применить атрибут UNIQUE
Можно и на TEXT поставить, если указать длинну ключа:
PHP:
ALTER TABLE `nTable`
ADD UNIQUE INDEX (`nKey`(90)) ;
 
В общем, если кому будет интересно:
Любой из предложенных вариантов для проверки на уникальность должен иметь индекс (различны способы его создания) т.е. каждая строка проходит проверку на предмет уникальности по уже имеющемуся индексу и если значение уникально MySQL его добавляет в выборку и ИЗМЕНЯЕТ индекс с учётом вновь добавленного значения.
Узкое место во всём этом - это скорость записи на диск т.к. каждая добавленная строка меняет индекс и он пишется на диск, т.е. чем дольше идёт выборка тем больше iowait.
В моём случае можно было закинуть этот индексный файл в ОЗУ и получить приемлемое время обработки (индекс был при выборке примерно 9 ГБ), но я не смог это сделать.
Запустил в тупую INSERT INTO Ttemp SELECT DISTINCT * FROM T; прождал 3 дня :lol:
Есть ещё подозрение, что так работает именно индекс MyISAM таблиц и м.б. другой тип будет отрабатывать быстрее.
Знаний нужных нет, а время на эксперименты было ограничено.
Так, что как то так.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху