импортировать объемные данные в MySQL - PullRequest
3 голосов
/ 23 июня 2010

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

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

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

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

ОБНОВЛЕНИЕ:

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

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

Ответы [ 4 ]

4 голосов
/ 23 июня 2010

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

https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

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

3 голосов
/ 23 июня 2010

LOAD DATA или несколько вставок будет намного лучше, чем одиночные вставки; ЗАГРУЗКА ДАННЫХ спасет вас чуть-чуть, вы, вероятно, не заботитесь об этом.

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

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

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

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

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

2 голосов
/ 09 марта 2011

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

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

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

1 голос
/ 23 июня 2010

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

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

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