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