对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。

特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。

经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。

1、一条SQL语句插入多条数据

常用的插入语句如:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);

修改成:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。

这里提供一些测试对比数据,分别是进行单条数据的导入与转化成一条SQL语句进行导入,分别测试1百、1千、1万条数据记录。

2、在事务中进行插入处理。

使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。

这里也提供了测试对比,分别是不使用事务与使用事务在记录数为1百、1千、1万的情况。

3、数据有序插入。

数据有序的插入是指插入记录在主键上是有序排列,例如datetime是记录的主键:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('2', 'userid_2', 'content_2',2);

修改成:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('2', 'userid_2', 'content_2',2);

由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。

我们可以参照InnoDB使用的B+tree索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;

如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

下面提供随机数据与顺序数据的性能对比,分别是记录为1百、1千、1万、10万、100万。

从测试结果来看,该优化方法的性能有所提高,但是提高并不是很明显。

4、性能综合测试

这里提供了同时使用上面三种方法进行INSERT效率优化的测试。

从测试结果可以看到,合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。

而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。

注意事项:

1、SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

2、事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。

链接:https://www.php.cn/mysql-tutorials-444407.html

mysql中sql批量插入_MySQL批量SQL插入性能优化相关推荐

  1. MySQL中定义fk语句_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (4)

    外键和其他约束 InnoDB和NDB存储引擎支持 FOREIGN KEY 和 REFERENCES 子句,这些存储引擎实现了ADD [CONSTRAINT [symbol]] FOREIGN KEY ...

  2. MySQL中特别实用的几种SQL语句

    MySQL中特别实用的几种SQL语句 文章目录 MySQL中特别实用的几种SQL语句 1. 插入或替换 2. 插入或更新 3. 插入或忽略 4. 指定数据快照或备份 5. 写入查询结果集 6. 强制使 ...

  3. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql

    java学习篇之---mysql中varchar类型总结 Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下 ...

  4. mysql中两次排序_MySQL中的两种排序方式: index和filesort

    index :通过有序索引顺序扫描直接返回有序数据,不需要额外的排序,操作效率较高. filesort:通过对返回数据进行排序,filesort 并不代表通过磁盘文件排序,而是说明进行了一个排序操作, ...

  5. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS ( Select column1,column2,column3,col ...

  6. vin-slam中调用ceres库内部代码分析与性能优化

    vin-slam中调用ceres库内部代码分析与性能优化 1,vin-slam中后端参数优化调用流程代码 2,ceres内部的求解流程(未完待续) 首先,很抱歉前几次上传的关于一些图像算法代码不全,主 ...

  7. sql加上唯一索引后批量插入_MySQL批量插入遇上唯一索引避免方法

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...

  8. mysql不存在就批量新增_mysql批量插入,存在则修改,不存在则插入

    批量插入,存在则修改,不存在则插入 INSERT INTO 表名 (字段1,字段2,字段3,字段4) VALUES (字段1值,字段2值,字段3值,字段4值) ON DUPLICATE KEY UPD ...

  9. mybatis mysql 批量更新_mysql批量update更新,mybatis中批量更新操作

    在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...

  10. mysqlplus 批量插入_mysql批量插入

    在MySQL数据库中,如果要批量插入数据(特别是上百万级超大数据), 用普通的insert into来操作非常不现实,速度慢人力成本高, 推荐使用Load Data或存储过程来导入数据, 我总结了一些 ...

最新文章

  1. java 注解类说明
  2. html number方法,JavaScript Number 对象
  3. MVC利用URLRoute实现伪静态后正真的静态html无法访问
  4. 灵活理解思科三层结构
  5. 一致 先验分布 后验分布_「分布式技术」分布式事务最终一致性解决方案,下篇...
  6. ImportError: No module named rospy
  7. 虎牙直播源解析【可选清晰度】
  8. Codeforces 208A:Dubstep(字符串)
  9. 让openkore 更节省你的CPU和内存
  10. gopher协议利用
  11. STRAIGHT分析合成算法
  12. Python实战:获取bing必应壁纸首页的每日一图(仅做学习用)
  13. rtl8188linux内核配置,编译基于rtl8188cu控制芯片的USB无线网卡在Linux下的配置
  14. 搬家公司怎么收费 搬家收费标准
  15. 基于android的同学录校友录系统app
  16. JAVA几种缓存技术介绍说明
  17. 论文浅尝 | MISC:融合COMET的混合策略模型进行情感支持对话
  18. 曙光1620-G20装Windows server 2008教程
  19. Bugly-iOS导入设置
  20. linux打开笔记本摄像头驱动程序,[已解决]如何给笔记本摄像头装驱动?

热门文章

  1. 在TABLE CONTROL 输入完一行记录,按回车的时候光标自动移动到下一行
  2. 重新洗牌的网约车,谁在接管下沉市场?
  3. python连接mongodb进行查询_Python中的MongoDB基本操作:连接、查询实例
  4. java邻接表无向图的创建_邻接表无向图(三) 之Java详解
  5. java io操作_Java IO 操作
  6. 现代支付行号查询系统_旅游景区智能管理系统-景区智能导航软件
  7. android:process=.server,Android启动(三)----开启SystemServer进程
  8. python语句中ord_浅谈Python中chr、unichr、ord字符函数之间的对比
  9. [一] 详细讲解: 线性表链式存储结构 中的 单链表; (数据结构和算法)
  10. php安卓交互安全,php结合安卓客户端实现查询交互实例