2012-05-14 3 views
0

У меня есть большой набор данных в MySQL (пользователи, компании, контакты)? около 1 миллиона записей.Вставка огромного набора данных [PHP, MySQL]

И теперь мне нужно сделать импорт новых пользователей, компаний, контактов из файла импорта (csv) с около 100000 записей. У записей из файла есть вся информация для всех трех сущностей (пользователь, компания, контакты). Кроме того, на производстве я не могу использовать LOAD DATA (просто не так много прав :()

Итак, есть три шага, которые должны быть применены к этому набору данных -.. Сравнение с существующими БД данных - обновить (если мы найдем что-то на предыдущем этапе) - и вставить новые, записывает

Я использую PHP на сервере для занятий, что я вижу два подхода:

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

, какой подход является более эффективным? по CPU, памяти или использованию времени

Могу ли я использовать транзакции? или это замедлит всю производственную систему?

Спасибо.

+0

Я не думаю, что вам нужно найти наиболее эффективный метод для этого. Для записей 100K это займет не более 20-30 секунд, и вам, вероятно, больше не понадобится вставлять эти записи ... –

+0

Вы шутите? я реализовал 1-й подход и занимает много времени, я уверен, что вы не можете себе представить, как работает он;) – user1016265

ответ

2

время CPU/время не будет много в нем, хотя чтение всего файла будет немного быстрее. Однако для такого большого набора данных дополнительная память, необходимая для чтения всех записей в памяти, значительно опередит преимущество по времени - я бы определенно обработал одну строку за раз.

+1

Согласен. И используйте транзакции, если требуется атомарность. – eggyal

+0

, но в этом случае транзакция должна быть запущена до и закончена после того, как линия была использована, не так ли? – user1016265

+0

@ user1016265 Зависит от того, что вы делаете. Если некоторые строки относятся к другим строкам в одном наборе данных, вы, вероятно, захотите обернуть все строки в одну транзакцию или, по крайней мере, группы строк, которые ссылаются друг на друга в одной транзакции (вам, вероятно, потребуется, по крайней мере, двухпроходный подход для это). Если нет ссылок на одну и ту же таблицу и нет круговых внешних ключей, одна транзакция в строке, вероятно, будет приемлемой. – DaveRandom

0

Знаете ли вы, что phpMyAdmin обладает этой замечательной функцией «возобновляемого импорта» для больших файлов SQL?

Просто проверьте «Разрешить прерывание импорта» в частичном Импорт раздела . И voila, PhpMyAdmin остановится и зациклится до тех пор, пока не будут выполнены все запросы.

Это может быть более эффективным, чтобы просто «использовать инструмент», а не «изобретать колесо»

+0

Как я могу импортировать что-то с помощью phpMyAdmin в три разные таблицы из одного файла импорта? – user1016265

+0

@ user1016265 phpMyAdmin попытается создать таблицы и даже базу данных, но не сможет решить, когда заканчиваются «пользователи» таблицы и когда начинаются «компании» таблицы. См. [3.18. Когда я импортирую CSV-файл, содержащий несколько таблиц, они объединяются в одну таблицу.] (Http://www.phpmyadmin.net/documentation/Documentation.html#faq3_18) –

+0

Я знаю это, но вы решение не может работать в моем случае. Спасибо – user1016265

0

Я думаю, второй подход является более приемлемым:

  1. Создать список изменений (это будет отдельная таблица)
  2. обновлять построчно (и отметьте каждую строку, как обновляется с помощью поля «updflag» , например)
  3. Выполнение этого процесса в фоновом режиме с использованием транзакций.