MySQL多行插入性能优化

6

我有包含大约30,000条记录的数据。我需要将这些数据插入到MySQL表中。我将这些数据按照每1000个为一组进行分组,并创建多个如下所示的插入操作:

INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000);

如何优化此插入操作的性能?我能否一次性插入1000条以上记录?每行数据大小约为1KB。谢谢。
3个回答

11
尝试将批量插入操作放在事务内部。
START TRANSACTION
INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000);
COMMIT

这可能会提高性能,但我不确定MySQL是否可以部分提交批量插入(如果不能,则这可能帮助不大)

请记住,即使是1.5秒,对于每个大小约为1k的30,000条记录,您正在进行20MB/s的提交速度,取决于您的硬件设置,实际上可能会受到驱动器限制。

建议您调查一下SSD或更改RAID设置,或者获取更快的机械驱动器(有很多关于使用安装在SSD上SQL数据库的利弊的在线文章)。


将批量“插入”循环包含在事务体内,可以显著减少磁盘I/O的数量,并加快在我的InnoDB数据库和廉价PATA磁盘上的操作。我想知道这个“技巧”是否可靠且可移植。这是在MySQL 5.6&Linux 2.6.32上进行的。 - davide
1
这种方法非常可靠和便携,因为内部所有的插入操作都不需要事务,而是创建和提交单独的事务,从而导致了显著的I/O开销。这种方法在几乎所有关系型数据库上都能明显提高性能,与不使用事务的唯一区别是整个插入将会回滚或提交,而不是允许一些插入提交而其他插入失败。 - Seph
4
这对我帮助很大。我将100条记录(每个GET请求的最大API记录数)分组,使用$mysqli->multi_query()执行INSERT INTO... ON DUPLICATE KEY UPDATE...操作,共有123k条记录,原计划需要2.5小时完成,但是我将每组记录都包装在事务中后,仅用了20分钟即可搞定所有123k条记录。我非常高兴地去吃午饭了。 - angelcool.net
结合事务(InnoDB)和批量插入,这不是最快的选项吗? - lubosdz

7
你需要检查mysql服务器的配置,特别是缓冲区大小等方面。如果有的话,可以从表中删除索引以使其更快。在数据到位后创建索引。看这里,你应该能得到所有需要的东西。一条带有多个值的插入语句比多个插入语句更快。参考链接:http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

谢谢。但是这个表太简单了,它没有索引,并且类型是MyISAM。 - Alex Pliutau

3

这是一次性操作吗?

如果是的话,只需为每个数据元素生成一个SQL语句,并在服务器上执行它们。 3万个数据元素不应该需要很长时间,您将拥有最简单的输入数据的方法。


所有记录都已成功插入。但是它需要近1.5秒的时间。我需要缩短这个时间。 - Alex Pliutau
7
在我看来,1.5秒插入30000条记录是相当不错的。只需显示一个旋转计时器并等待即可。 - Toby Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接