2010-06-22 5 views
3

Итак, я пытаюсь импортировать некоторые данные о продажах в свою базу данных MySQL. Данные изначально представлены в виде необработанного CSV-файла, который необходимо выполнить моему PHP-приложению, а затем сохранить обработанные данные о продажах в базу данных.импортировать массивные данные в MySQL

Первоначально я делал индивидуальные запросы INSERT, которые я понял, был невероятно неэффективным (~ 6000 запросов, принимающих почти 2 минуты). Затем я сгенерировал один большой запрос и INSERT опубликовал данные сразу. Это дало нам повышение эффективности на 3400% и сократило время запроса до чуть более 3 секунды.

Но, как я понимаю, LOAD DATA INFILE предполагается еще быстрее, чем любой запрос INSERT. Итак, теперь я собираюсь записать обработанные данные в текстовый файл и использовать LOAD DATA INFILE, чтобы импортировать его в базу данных. Является ли это оптимальным способом вставки больших объемов данных в базу данных? Или я об этом совершенно не так?

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

UPDATE:

Так что я пошел вперед и тест LOAD DATA INFILE, как предложено, думая, что это может дать мне лишь незначительное увеличение скорости (так как я сейчас пишу одни и те же данные на диск дважды), но я был удивил, когда он сократил время запроса с более чем 3300 мс до ~ 240 мс. Страница все еще занимает около 1500 мс, чтобы выполнить общее количество, но она по-прежнему заметно лучше, чем раньше.

Отсюда я буду проверять, есть ли у меня лишние индексы в базе данных, и поскольку все, кроме двух моих таблиц, являются InnoDB, я буду изучать оптимизацию пула буферов InnoDB для оптимизации общей производительности ,

+1

Я знаю, что этот вопрос был отправлен много веков назад, но я должен сказать, что разница между одним объемом INSERT и LOAD DATA INFILE - это время, которое было сохранено. Я пошел от 30 секунд/более с INSERT до примерно 10 секунд, загружая строку 11000 с 30 столбцами CSV-файла. –

ответ

4

LOAD DATA INFILE очень быстрый способ и является правильным способом импорта текстовых файлов в MySQL. Это один из рекомендуемых методов для ускорения вставки -up данных в 20 раз быстрее, в соответствии с этим:

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

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

1

Вы должны быть в порядке с вашим подходом. Я не уверен, насколько быстрее LOAD DATA INFILE сравнивается с объемным INSERT, но я слышал то же самое, что он должен быть быстрее.

Конечно, вы захотите сделать некоторые тесты, чтобы убедиться, но я бы сказал, что стоит написать некоторый тестовый код.

3

LOAD DATA или несколько вставок будут намного лучше, чем отдельные вставки; LOAD DATA экономит вам немного, что вам, вероятно, не очень нравится.

В любом случае, достаточно много, но не слишком много в одной транзакции. Обычно 10 000 строк на транзакцию воспринимаются правильно (NB: это не относится к механизмам без транзакций). Если ваши транзакции слишком малы, он будет тратить все время на синхронизацию журнала с диском.

Большая часть времени делает большую вставку, исходящую из индексов зданий, что является дорогостоящей и интенсивной в работе операцией.

Если вам нужна производительность,

  • иметь несколько индексов, как возможные
  • Убедитесь, что таблица и все ее индексы вписываться в ваш InnoDB буферный пул (Предполагая, что InnoDB здесь)
  • Просто добавить больше оперативной памяти пока ваш стол не поместится в памяти, если это не будет чрезмерно дорогостоящим (64G сейчас не слишком дорого)

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

2

Ребята, у меня был тот же вопрос, мои потребности, возможно, были немного более конкретными, чем общие, но я написал сообщение о моих выводах здесь.

http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

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

В любом случае, надеюсь, это вам поможет?

+0

Интересно. Это, безусловно, полезно знать для многих случаев использования, хотя я немного запутался в том, как вы получили показатель 0.0013sec. (Я плохо разбираюсь в статистике.) –

+1

Lese: Это связано со стандартным отклонением. Мое понимание стандартного отклонения показывает, сколько дисперсий существует из среднего. (Excel сделал расчет для меня). Моя точка зрения заключалась в том, что стандартное отклонение для объема было меньше, чем у данных нагрузки. Это для меня означало, что BULK был наиболее последовательно быстрее. Что для меня было самым важным фактором при принятии решения об этом. В основном потому, что это работало на реальном сайте. Надеюсь, это имеет смысл? Посмотрите здесь дополнительную информацию: http://en.wikipedia.org/wiki/Standard_deviation – Andy