数据分了两张表,一张表 500 万,表包含两个 varchar 类型字段,除主键外还建了一个 unique 索引
使用 mybatis,开了 8 个线程,每张表分配 4 个线程,数据库连接池设置 maximum-pool-size = 32
花了 53 分钟...
想问下插入大量数据应该怎么优化
1
SimbaPeng 2018-05-21 22:44:09 +08:00
load data 了解一下?
|
6
codespots 2018-05-21 22:52:15 +08:00
insert 可以插入多条数据,了解一下,预计你这个量级也只是在几分钟内就可以跑完
|
7
gamexg 2018-05-21 22:54:58 +08:00
加事务了吗?
把操作包到事务里面。 |
8
niubee1 2018-05-21 22:56:31 +08:00
batch insert
了解一下 |
9
dobelee 2018-05-21 23:04:13 +08:00 via Android
看你數據大小吧,單條不大的話,multi-insert 幾分鐘搞定。我經常生產數據做測試,都是 1000w 左右。
|
12
pathbox 2018-05-21 23:38:10 +08:00 via iPhone
2000 条一个批量,批量插入速度会提升很多的。我之前做过 1000-2000 条这样的批量插入 没什么问题
|
13
gamexg 2018-05-21 23:55:39 +08:00
@lry #10 我的意思是把插入操作包到一个事务里面可以提高性能。
我这里没有 mysql 的数据,前段时间刚测试过 mssql 批量插入,记得性能是这样: bulkcopy > 单条语句插入多行 = 单事务单语句插入单行 > 无事务单语句插入单行 印象最好的结果是 bulkcopy xW 行 /秒,可惜这个是 ms 专有的... |
15
woodface2233 2018-05-22 08:30:33 +08:00 via iPhone
很快并发写入
|
16
abccccabc 2018-05-22 09:43:01 +08:00
楼主,你在另外一张新表插入数据前,先不要建立索引,然后启用事务,插入数据。数据插完后,再添加索引。试下
|
18
opengps 2018-05-22 10:26:09 +08:00
为什么没人说说硬盘环境是啥?
为啥不说明下单行数据多大? 以我测试过的 gps 轨迹为例,普通 5400 转机械盘,单行 1k 大小,顺序写入,iops 可达 3000,也就是说一秒添加 3000 行 另外,你的索引需要每次重新编排,或导致你随着数据变多,插入速度越来越慢,这时候,就别只看平均值了 |
19
opengps 2018-05-22 10:31:04 +08:00
硬盘速度接近极限之后,自然就没法进一步提速了
楼主可能就是机械硬盘,平均算了下 3144iops,跟我的测试结果接近,可能已经达到了 5400 转机械盘的写入速度和 iops 值。 这种情况,还可以稍微改进下,就是大块写入,避免单行写入。 有意义的其他改进,就是 :多块硬盘,换 ssd,上多硬盘磁盘阵列,做多个数据库负载 等几个方向 |
21
hooopo 2018-05-22 16:04:55 +08:00
|