mysql 批量插入数据越来越慢 如何解决?

2018-02-26 11:50:53 +08:00
 madaima

表中有两个唯一索引;

使用 php 对一个数据表进行批量插入时,开始插入 1w 条数据只要 2s,插入 50w 条数据过后,再次插入 1w 条数据需要 18s ;

sql 使用的是拼接方式,3000 条数据拼接成一条 sql 执行;

这种问题如何解决?

7022 次点击
所在节点    MySQL
18 条回复
yidinghe
2018-02-26 11:54:08 +08:00
首先拼接 SQL 执行并不是真正的批量插入,最好使用标准的批量插入方式;其次,表的索引要尽可能的少,索引越多插入效率越低。
realpg
2018-02-26 12:37:53 +08:00
igonre delayed 循环插吧 不用拼接成一个
msg7086
2018-02-26 12:55:13 +08:00
禁用索引,换 SSD。
alvinbone88
2018-02-26 12:58:13 +08:00
akira
2018-02-26 13:02:08 +08:00
把索引删了,数据导完以后再加回来
male110
2018-02-26 13:29:47 +08:00
把索引删了,数据导完以后再加回来
lastpass
2018-02-26 13:56:52 +08:00
可以试着先插入到一个空的中间表,再复制到的需要插入的表里。我原来在 oracle 上实验过这种方式最快。MySQL 应该也是同理。
lianxiaoyi
2018-02-26 14:11:00 +08:00
最简单的你可以试试 1 万个一条 SQL。降低内部刷 IO
est
2018-02-26 14:15:30 +08:00
把 @alvinbone88 那篇文章一定挨个看完。绝对不会慢。
fakepoet
2018-02-26 14:15:57 +08:00
mysql 的单表 IO 放大问题,如果数据量百万级接近千万,建议分表。
madaima
2018-02-26 14:38:12 +08:00
@msg7086 不用索引怎么确定数据唯一呢
madaima
2018-02-26 14:54:44 +08:00
@alvinbone88 谢谢,我测试了一下 1000 条数据批量插入时,临时关索引 所消耗的时间基本是 不关索引插入 的一半,但是批量插入 1 万条时 两个方法都超过 30s 了。我在仔细看看文档。
madaima
2018-02-26 14:55:31 +08:00
谢谢 各位朋友的指导 我就不一个个 @了
madaima
2018-02-26 14:56:09 +08:00
@fakepoet 后期打算分表了。
madaima
2018-02-26 15:21:24 +08:00
@lianxiaoyi 1 万条数据拼接成的 sql 字符串长度会超过 mysql 限制的 65535 个字符长度,虽然能修改配置,但是不方便。
beginor
2018-02-26 18:42:41 +08:00
分表会增加不少逻辑,如果能做表分区的话最好了
runntuu
2018-02-26 19:08:56 +08:00
看一下执行时间都花在哪了,
https://www.cnblogs.com/happySmily/p/5943311.html
opengps
2018-02-26 23:47:55 +08:00
看下你的聚集索引是什么字段,尽量采用时间等字段当聚集索引,这样追加数据物理上是尾部追加,而不是中间填充。数据量大了相差很明显,我曾做过实验,10 亿都没问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/432691

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX