mysql如何更快地插入数百万条记录?

mysql如何更快地插入数百万条记录?,mysql,insert,records,Mysql,Insert,Records,我想在我的数据库中插入大约数百万条记录,但速度非常慢,大约40000条记录/小时,我不认为我的硬件太慢,因为我看到diskio低于2 MiB/s。我有许多表,它们分别放在不同的.sql文件中。一条记录也很简单,一条记录少于15列,一列少于30个字符。我用mysql 5.3在archlinux下完成了这项工作。你们有什么想法吗?或者这个速度不慢吗?很可能是因为您正在插入这样的记录: INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1",

我想在我的数据库中插入大约数百万条记录,但速度非常慢,大约40000条记录/小时,我不认为我的硬件太慢,因为我看到diskio低于2 MiB/s。我有许多表,它们分别放在不同的.sql文件中。一条记录也很简单,一条记录少于15列,一列少于30个字符。我用mysql 5.3在archlinux下完成了这项工作。你们有什么想法吗?或者这个速度不慢吗?

很可能是因为您正在插入这样的记录:

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 INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");
您还可以在中阅读有关插入速度的更多信息。它清楚地描述了以下内容

要优化插入速度,请将许多小操作合并到单个大操作中。理想情况下,只建立一个连接,一次发送多个新行的数据,并将所有索引更新和一致性检查延迟到最后

当然,如果数量巨大,不要将所有这些合并在一起。假设有1000行需要插入,那么不要一次插入一行。但您可能不应该在一个查询中同时尝试所有1000行。而是把它分成更小的尺寸

如果它仍然很慢,那么可能只是因为您的服务器很慢


请注意,您当然不需要在组合查询中使用所有这些空格,这只是为了更好地了解答案。

您应该能够每分钟上传40k行。如何导入记录?瓶颈是什么?你是如何插入这些记录的?您能否以某种方式对此进行分析,以确定哪个部分需要花费很长时间?您还可以使用准备好的语句—也就是说,如果您是通过编程语言进行插入的话。实际上,我从sqlite数据库中转储了所有表,并保存为.sql文件。我想使用以下命令将这些表导入mysql服务器:mysql-u user-p database表1
字段1
字段2
)中插入值(“数据1”,“数据2”);在
表1
字段1
字段2
)中插入值(“数据1”,“数据2”)。。。。。。(数百万行)的可能重复。我尝试用单个查询插入大约50000行,但得到的错误是sql查询太大。@约瑟夫然后在每次超过x行时创建一个新查询。这个答案非常有用。逐步插入花费了我将近6个小时来完成插入150万条记录,但使用这种方法,每一步插入10000条记录,只需约90秒:如果您能够从文本文件导入数据,请使用加载数据填充。MySQL手册说这通常比使用INSERT语句快20倍。也许这看起来合乎逻辑,但如果插入的数据是外部的(用户、第三方公司),查询必须受到sql注入的保护,该怎么办?