Mysql批量插入更新性能优化

Mysql批量插入更新性能优化


对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译、单条sql插入多条数据、事务插入等,下面详细介绍一下:

单条插入(Mybatis)

        INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES
        (${cityCode}, ${cityName}, ${provinceName}, ${alias}, ${abbrePy})
单条预编译插入(Mybatis)
采用预编译可以节约mysql服务的解析时间,mytatis中就是采用#变量
        INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES
        (#{cityCode}, #{cityName}, #{provinceName}, #{alias}, #{abbrePy})
单条sql插入多条数据
即是拼接sql,在一个sql中插入多条或更新多条数据。
        INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES
        ("cityCode1", "cityName1", "provinceName1" "alias1", "abbrePy1"),("cityCode2", "cityName2", "provinceName2" "alias2", "abbrePy2")

快的原因

  1. 合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率;
  2. 通过合并SQL语句,减少网络传输的IO;
  3. 通过合并SQL语句,减少SQL语句解析的次数;

注意事项

  1. 数据库sql长度是有限制,sql长度别溢出,会报错;
  2. 乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快;
事务插入

事务插入即在插入前开启事务,插入结束关闭事务进行提交即可。

快的原因

  1. 进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗;

注意事项

  1. 事务不能过大,MySQL有innodb_log_buffer_size配置项,事务超出这个时,会刷磁盘,导致性能下降;
  2. 乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快;

测试结果
环境:i5-4200U 1.6GHZ,12G内存,固态硬盘

\:单条插入::单条预编译::单条插入多条::事务插入:
10004600毫秒3334毫秒8毫秒704毫秒
1000027204毫秒26249毫秒2959毫秒2959毫秒
100000240954毫秒254716毫秒17286毫秒20539毫秒

总结
采用合并sql+事务插入组合,效率最高,乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快;尽量采用非乱序方式即可

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值