Mysql批量插入更新性能优化
作者:网络转载 发布时间:[ 2017/1/3 10:38:19 ] 推荐标签:数据库 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")
快的原因
合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率; 通过合并SQL语句,减少网络传输的IO; 通过合并SQL语句,减少SQL语句解析的次数;
注意事项
数据库sql长度是有限制,sql长度别溢出,会报错; 乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快; 事务插入
事务插入即在插入前开启事务,插入结束关闭事务进行提交即可。
快的原因
进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗;
注意事项
事务不能过大,MySQL有innodb_log_buffer_size配置项,事务超出这个时,会刷磁盘,导致性能下降; 乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快;
测试结果
环境:i5-4200U 1.6GHZ,12G内存,固态硬盘
:单条插入: :单条预编译: :单条插入多条: :事务插入: 1000 4600毫秒 3334毫秒 8毫秒 704毫秒 10000 27204毫秒 26249毫秒 2959毫秒 2959毫秒 100000 240954毫秒 254716毫秒 17286毫秒 20539毫秒
总结
采用合并sql+事务插入组合,效率高,乱序插入时候速度超过innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快;尽量采用非乱序方式即可
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11