2015-10-01 3 views
1

Я пытаюсь импортировать очень большой SQL-дамп (около 37 миллионов строк) в таблицу InnoDB. Есть много дубликатов, и я хочу достичь, не изменяя фактический дамп, чтобы предотвратить повторную вставку строк. Поле email может иметь дубликаты. Я попробовал следующее: после импорта всего дампа в БД я попытался выполнить следующий SQL:Быстрое удаление дубликатов записей в MySQL

set session old_alter_table=1; 
ALTER IGNORE TABLE sample ADD UNIQUE (email); 

Но второй запрос работает около 1 часа, а затем я просто отменил этот запрос.

Что такое правильный способ избавиться от дубликатов?

У меня есть пара идей:

  • Может быть, прежде чем начать импортировать, чтобы сделать таблицу с уникальным индексом и в то время как вставки для предотвращения дубликатов без ущерба для всего процесса?
  • Возможно, после импорта дампа, чтобы выбрать отдельный адрес электронной почты и вставить в другой стол?
+0

Возможный дубликат: http://stackoverflow.com/questions/18485674/how-to-skip-duplicate-records-when-importing-in-phpmyadmin – JimmyB

ответ

0

Из .dump файла

При импорте использовать -f для "силы":

mysql -f -p < 2015-10-01.sql 

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


Из файла .csv

Если вы используете "LOAD DATA", использовать "Ignore", например:

LOAD DATA LOCAL INFILE 'somefile.csv' IGNORE 
    INTO TABLE some_db.some_tbl 
     FIELDS TERMINATED BY ';' 
       OPTIONALLY ENCLOSED BY '"' 
     LINES TERMINATED BY '\n' 
    (`somefield1`,`somefield2`); 

Согласно documentation:

Если вы укажете IGNORE, строки, которые дублируют существующую строку на уникальном значение ключа отбрасывается.

Для этого необходимо создать уникальное ограничение ключа перед импортом, которое будет быстро на пустой таблице.

+0

У меня есть .dump-файл, который состоит из sql create table и insert команды. Я просто импортирую, как 'mysql -u root -p sample_db heron

+0

что «вынуждает» делать с этой проблемой? – heron

0

Редактировать файл дампа следующим образом:

  1. Изменить CREATE TABLE заявление, чтобы добавить уникальный ключ на email поле, или добавить ALTER TABLE заявление после него.

  2. Найти все сообщения INSERT INTO sample и изменить их на INSERT IGNORE INTO sample.

Вы также можете сделать шаг 2 с использованием трубопровода:

sed 's/INSERT INTO sample/INSERT IGNORE INTO sample/' sample_table.dump | mysql -u root -p sample_db 

Если файл слишком велик для редактирования, чтобы добавить ALTER TABLE заявления, я предлагаю вам создать дамп с --no-create-info вариантом mysqldump , и создайте таблицу вручную (с помощью уникального ключа) перед загрузкой файла дампа.

+0

1.5 GB текстовый файл. как заменить все вхождения? :) – heron

+0

Я обновил ответ, чтобы показать, как это сделать, не редактируя файл дампа. – Barmar