Подтвердить что ты не робот

Как mysql быстрее вставляет миллионы записей?

Я хотел вставить около миллиона записей в мою базу данных, но он шел очень медленно со скоростью около 40 000 записей в час, я не думаю, что мое оборудование слишком медленное, потому что я видел, что diskio находится под 2 MiB/s. У меня много таблиц, разделенных в разных .sql файлах. Одна единственная запись также очень проста, одна запись имеет менее 15 колонок, а один столбец имеет менее 30 символов. Я выполнил эту работу под archlinux с помощью mysql 5.3. У вас есть идеи? Или эта скорость не замедляется?

4b9b3361

Ответ 1

Скорее всего, потому, что вы вставляете такие записи:

INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2");
INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2");
INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2");
INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2");
INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2");

Отправка нового запроса каждый раз, когда вам нужно INSERT что-то плохо. Вместо этого просто объедините все эти запросы в один запрос, например.

INSERT INTO 'table1' ('field1', 'field2') VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");

Вы также можете узнать больше о скорости вставки в Документах MySQL. В нем четко описывается следующее.

Чтобы оптимизировать скорость вставки, объедините множество небольших операций в одну большую операцию. В идеале вы делаете одно соединение, отправляете данные для многих новых строк одновременно и задерживаете все обновления индексов и проверку согласованности до самого конца.

Конечно, не объединяйте ВСЕ их, если сумма ОГРОМНА. Скажем, у вас 1000 строк, которые нужно вставить, а затем не делайте этого по одному. Но вы, вероятно, не должны стараться иметь все 1000 строк в одном запросе. Вместо этого разделите его на меньшие размеры.

Если он все еще очень медленный, это может быть просто из-за медленного вашего сервера.

Обратите внимание, что вам, разумеется, не нужны все эти пробелы в объединенном запросе, чтобы просто получить лучший обзор ответа.