ВСТАВИТЬ ИГНОР или ВСТАВИТЬ ГДЕ НЕ В - PullRequest
1 голос
/ 28 августа 2011

У меня есть таблица с 9 миллионами строк, и я изо всех сил пытаюсь обработать все эти данные из-за ее огромного размера.

Что я хочу сделать, это добавить ИМПОРТ CSV в таблицу без перезаписи данных.

Прежде чем я сделал что-то подобное; INSERT, если не в (выберите адрес электронной почты из tblName, где source = "number" и email! = "Email") INTO (email ...) VALUES ("email" ...)

Но я переживаю, что снова сломаю сервер. Я хочу иметь возможность вставлять 10000 строк в таблицу, но только если ее нет в таблице с source = "number".

В противном случае я бы использовал уникальный в столбце электронной почты.

Короче говоря, я хочу как можно быстрее ВСТАВИТЬ, не вводя дубликаты в таблицу, проверив две вещи. Если email! = "Email" И источник! = "Number", вставьте в таблицу, иначе ничего не делайте. И я не хочу отчетов об ошибках либо.

Извините за плохую формулировку и вопрос, звучащий немного глупо.

Мне просто трудно понять, что я не смог проверить их на данных, загрузив резервные копии и загрузив их, если что-то пойдет не так. Я ненавижу большие наборы данных:)

Спасибо всем за потраченное время -BigThings

Ответы [ 2 ]

3 голосов
/ 28 августа 2011

Если у вас есть уникальные ключи в этих полях, вы можете использовать опцию LOAD DATA INFILE с IGNORE.Это быстрее, чем вставка строка за строкой, и быстрее, чем мульти-вставка.

Посмотрите на http://dev.mysql.com/doc/refman/5.1/en/load-data.html

0 голосов
/ 28 августа 2011

Установите ограничение UNIQUE для столбцов email и source.

Затем выполните:

INSERT INTO table_name(email, source, ...) VALUES ('email', 'source', ...)
ON DUPLICATE KEY UPDATE email = email;

INSERT IGNORE не будет уведомлять вас о каких-либоошибки.Я бы не рекомендовал это.Я бы тоже не рекомендовал INSERT ... WHERE NOT IN.MySQL уже хорошо оптимизировал функциональность для этого.Вот почему INSERT ... ON DUPLICATE KEY UPDATE здесь.

...