加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

数据库插入可能更新大批量数据的机能优化

发布时间:2018-08-16 08:27:51 所属栏目:编程 来源:学习与分享
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 对付一些数据量较大的体系,数据库面对的题目除了查询服从低下,尚有就是数据入库时刻长。出格像报表体系,天天耗费在数据导入上的时刻也许会长达几个小时或十几个小时之久。因此,
副问题[/!--empirenews.page--] 技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战

数据库插入可能更新大批量数据的机能优化

对付一些数据量较大的体系,数据库面对的题目除了查询服从低下,尚有就是数据入库时刻长。出格像报表体系,天天耗费在数据导入上的时刻也许会长达几个小时或十几个小时之久。因此,优化数据库插入机能是很故意义的。

颠末对MySQL InnoDB的一些机能测试,发明一些可以进步insert服从的要领,供各人参考参考。

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

常用的插入语句如:

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);  
  2. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 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、在事宜中举办插入处理赏罚。

把插入修改成:

  1. START TRANSACTION;  
  2. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);  
  3. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);  
  4. ...  
  5. COMMIT; 

行使事宜可以进步数据的插入服从,这是由于举办一个INSERT操纵时,MySQL内部会成立一个事宜,在事宜内才举办真正插入处理赏罚操纵。通过行使事宜可以镌汰建设事宜的耗损,全部插入都在执行后才举办提交操纵。

这里也提供了测试比拟,别离是不行使事宜与行使事宜在记录数为1百、1千、1万的环境。

数据库插入可能更新大批量数据的机能优化

3、数据有序插入。

数据有序的插入是指插入记录在主键上是有序分列,譬喻datetime是记录的主键:

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

修改成:

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);  
  2. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);  
  3. 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服从优化的测试。

数据库插入可能更新大批量数据的机能优化

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读