当前位置:首页 > 芯闻号 > 充电吧
[导读]对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。

经过对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、在事务中进行插入处理。把插入修改成:


    START TRANSACTION;  
    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);  
    ...  
    COMMIT;

使用事务可以提高数据的插入效率,这是因为进行一个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的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。


注意事项:

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

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




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:对步进电机优化研究的必要性、特点进行了阐述,并详细介绍了步进电机的设计方法。以某卫星天线驱动用步进电机为基础,分析了不同的转子结构、电磁参数对步进电机性能的影响,并进行了性能优化研究。

关键字: 磁钢厚度 铁芯迭长 性能优化

北京2022年4月18日 /美通社/ -- 4月9日-13日,第十三届国际性能工程学大会(ICPE2022)在线召开,大会由国际计算机协会ACM和标准性能评估组织SPEC联合举办,高效能服务器和存储技术国家重点实验室承办...

关键字: 性能优化

问题描述C保险公司业务系统中,团体保险明细查询速度很慢。查询时输入保单号,要返回团体保单包含的所有被保险人的信息。较小的保单,包含1万个被保险人,返回页面需要等待7.5分钟。较大的保单,包含100万被保险人,返回页面等待...

关键字: 数据库 SQL 代码 性能优化

前言这篇文章的主题是记录一次Python程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一点是,我的方式不是唯一的,大家在性能优化之路上遇到的问题都绝对不止一个解决方案。...

关键字: TCP 性能优化 数据库 PS

↓推荐关注↓今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景...

关键字: 内存 性能优化

↓推荐关注↓今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景...

关键字: 内存 性能优化

前言sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说...

关键字: sql

前言相信大多数的小伙伴都会觉着性能优化是一件很复杂的事,那么事实是不是这样的呢?优化应用程序获得最佳性能确实不是一件容易的事。它需要一定的经验和知识。那么,现阶段还不具备这样的经验和知识的我们,是不是就做不到了呢?也不是...

关键字: 性能优化

来源:https://juejin.cn/post/6860252224930070536| 背景日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查...

关键字: mysql

来源:https://segmentfault.com/a/1190000018075241前言这篇文章的主题是记录一次程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一...

关键字: 性能优化
关闭
关闭