librown
@librown
На-все-руки-мастер и немного кодер

Какой «длины» может быть INSERT? Как импортировать 1 млн строк?

Привет!

Необходимо регулярно парсить большой xml-файл на 1.5 млн строк (2ГБ). Я его благополучно "разбираю" за 20 минут, получаю все строки в массив. И теперь необходимо заполнить таблицу в БД.

Сейчас делаю инсерты циклом по 2000 (число выбрал на угад) строк за раз:
INSERT INTO tbl (field1, field2) VALUES ('1', '2'),('3', '4'),('5', '6') ...


Получается 750 итераций цикла. Занимает этот весь процесс 5 часов. Необходимо уложиться в хотя бы 1-2 часа.

Подскажите в какую сторону копать? Можно ли сделать один инсерт сразу на 1.5 миллиона строк?

Что лучше: больше итераций цикла, на более "коротких" инсертах или наоборот?

P.S. Сервер - 4ГБ ОЗУ, 2 ядра.

Спасибо!
  • Вопрос задан
  • 440 просмотров
Пригласить эксперта
Ответы на вопрос 4
romy4
@romy4
Exception handler
индексы выключайте перед вставкой. 1млн — это мало. вы не там ищите
Ответ написан
@Sumor
Прочитайте раздел документации и выполните рекомендации
optimizing-innodb-bulk-data-loading

Нужно максимально отключить дополнительную работу БД: автоинкременты, индексы, триггеры, констрейнты, если есть возможность загружать без транзакций (Bulk load).
Может будет лучше загрузить во временную таблицу в памяти через load xml, а затем вставить в свою таблицу ерез insert into ... select ...
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
я недавно столкнулся с задачей загрузить 45млн строк из файла с инсертами, грузил в AWS RDS. Напрямую ориентировочное время загрузки было около 2 суток. после конвертации sed-ом в csv LOAD DATA INFILE отработал за 20 минут. Оказывается, так МНОГО быстрее.
я это к чему... если структура не совпадает - структуру можно создать на этапе парсинга. Или загрузить как есть во временную таблицу, а потом уже сделать INSERT SELECT FROM
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если структура XML совпадает, со структурой базы, то LOAD XML
Если же нет, то можете попробовать перед вставкой отключить все индексы, после вставки включить их обратно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы