mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下

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

经过对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万条数据记录。

31bc05047bea5f443dd58fdd8a90ce74.png

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;

19622c4e2afecb2740359614033a95c8.png

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万。

722d5b76f4a8a0ea681b8ccae4872de0.png

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

性能综合测试:

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

55017a17099a4fa31e19ae2fd7b3d3b3.png

从测试结果可以看到,合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组 参数传递

/************************作者:张平*创建日期:2009 04 07*功能:************************//*void main(){ char str1[30]{"Peoples Republic of "}; char str2[]{"China"}; int a[2][3]{{1,2,3},{4,5,6}}; int b[3][2],i,j; printf("array a:\n&quo…

不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然

很多时候,要求文档要有目录,比如书籍/杂志/论文/标书等等。目录可以让文档结构一目了然。如果不了解 Word (包括 Microsoft Office 和 WPS Office 下的Word)操作,目录的各标题及对应页码可能是手动一个一个码上去。其实…

合成/聚合原则: 桥接模式

假想场景:hp和apple是全球知名的电脑生产厂家,起初他们各自的电脑操作系统分别是linux和macintosh,microsoft是软件行业的龙头。为了吸引更多客户购买电脑,hp和apple请ms为他们开发两款最常用的软件,办公软件和及时通讯…

java查看jdk源码_Java-如何查看JDK源码

一、引言学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档,然而,开发文档只是开发者对Java代码的功能做出简略的说明,它只是告诉你这个类能干嘛,并没告诉你这个类怎么干,所以,阅读Java源码是每个开…

arrays中copyof复制两个数组_数据结构与算法(3)数组

前言数组(Array)是一种线性表数据结构,利用一组连续的内存空间,存储一组具有相同类型的数据。概念介绍首先我们说一下什么是线性表,线性表就是数据排成一条线的数据结构,每个线性表最多只有前和后两个方向,数组、链表、…

java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下

这两天在使用RBManager(一个开源工具,用于多国化字符转化)工具的时候觉得很不方便,有的时候只需要知道中文对应的unicode码是多少,不需要这么麻烦的操作,所以就自己写了一个工具,专门用于将中文…

java lambda 实现_Java 8 Lambda实现原理分析

PDF文档已上传Github为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢?在没有深入分析前,让我们先想一想,Java 8中每一…

unity game和scene效果不一样_KTV装修设计:如何让消费者体验到不一样的KTV娱乐效果...

现代KTV装修设计要尽显奢华与高贵,但起到吸引消费者的却是浓烈的欢快氛围和愉悦的歌唱体验.KTV想要有一个好的装修效果,需要了解各方面的细节问题.下面怡元小编讲述如何设计能让消费者体验到不一样的KTV娱乐效果?1、氛围设计在KTV装修设计中,氛围设计非常考究,尤其是消费者进入…

SQL學習

1.模糊表名的联合查询..create table tz2008_1_1(id int,name varchar(50))insert into tz2008_1_1 select 1,acreate table tz2008_1_2(id int,name varchar(50))insert into tz2008_1_2 select 2,bcreate table tz2008_1_3(id int,name varchar(50))insert into tz2008_1_3 s…

feather 设置坐标刻度_Matlab中将坐标轴放在原点位置

转载一篇文章,原文链接:https://blog.csdn.net/xiaobiyin9140/article/details/84519419​blog.csdn.net需求使用matlab画图:设置y轴位置,使y轴在x轴的中间示例画一个sigmoid函数MATLAB代码x-10:0.1:10; ysigmf(x,[1 0]); plot(…

hana数据库导入mysql_【SAP HANA】新建表以及操作数据(3)

账号和数据库都创建好之后,接下来就可以创建表了。来见识一下这个所谓“列式”存储方式的表是长啥样的!一、可视化新建表然后输入所需栏位,设置好类型和长度:上图右上角可以看到类型是Column Store,代表列式存储&#…

(转)Asp.net 中 Get和Post 的用法

单form的提交有两种方式&#xff0c;一种是get的方法&#xff0c;一种是post 的方法.看下面代码,理解两种提交的区别: <form id"form1" method"get" runat"server"> <div> 你的名字<asp:TextBox ID"name" ru…

matlab lu分解求线性方程组_计算方法(二)直接三角分解法解线性方程组

封面是WH2里春希在编辑部的上司麻理前辈&#xff0c;有一说一&#xff0c;这条线的第一次H有点恶趣味&#xff0c;不是很喜欢。一&#xff1a;概述矩阵分解我学过的挺多种&#xff0c;比如极分解&#xff0c;谱分解&#xff0c;满秩分解&#xff0c;正交三角分解还有这里的直接…

java pdf添加图片水印图片_Java 在PDF中添加文本水印、图片水印

(推荐)方式1&#xff1a;创建Maven项目程序&#xff0c;通过maven仓库下载导入。以IDEA为例&#xff0c;新建Maven项目&#xff0c;在xml文件中配置maven仓库路径&#xff0c;并指定spire.cloud.sdk的依赖&#xff0c;如下&#xff1a;com.e-icebluecloudhttp://repo.e-iceblue…

html弹出保存文件对话框_有没有遇到过CAD文件损坏或打不开的情况?养成这个习惯很重要...

经常使用CAD制图&#xff0c;难免会遇到CAD文件损坏或者打不开的情况&#xff0c;遇到这种情况&#xff0c;我们会想尽办法来恢复文件&#xff0c;而最有效的办法之一就是从备份文件中恢复我们的图形&#xff0c;因此在制图过程中&#xff0c;我们应养成备份的好习惯&#xff0…

用javascript读取xml,并进行修改xml数据,解决保存没有权限问题

从 fsdy2000&#xff08;乡愁&#xff09;提供的方法获得思路&#xff0c;参考公司web gis 脚本实现 http://topic.csdn.net/t/20060105/15/4499889.html可以这样&#xff1a; 在脚本中修改xml文档后。再用xmlhttp进行页面申请。 xmlhttp new Acti…

linux java uml_简单实用UML关系图解

一句话UML&#xff0c;再记不住就要DPP了&#xff1a;关系图解代码备注1&#xff1a;继承关系(Generalization)2&#xff1a;实现关系(Realization)3&#xff1a;依赖关系(Dependency)方法的参数、局部变量、返回值4&#xff1a;关联关系(Association)互为类属性5&#xff1a;方…

python接口和抽象类的区别_接口和抽象类有什么区别?

最近团队在招人&#xff1a;阿里新零售事业群CBU技术部招Java高级&专家&#xff0c;团队主要负责B2B工业品牌业务&#xff0c;坐标杭州滨江&#xff0c;有兴趣的小伙伴私戳我。 ******************************************** 以下是原文&#xff1a; 本身的设计目的就是不…

版本控制工具SVN+Apache整合

一 SVN服务器端基础配置 1.创建文件库&#xff0c;开启服务 假设SVN服务器安装在D盘根目录下&#xff0c;文件库创建为D盘下的repository_svn文件夹。 sc create svnserve binpath "D:\svn-win32-1.5.0\bin\svnserve.exe --service --root D:\repository_svn" displa…

linux scrapy 定时任务_Linux定时任务给心爱的小姐姐发情书

计划任务基本概述什么是crond?crond就是计划任务&#xff0c;类似于我们平时生活中的闹钟&#xff0c;定点执行。为什么要用crond?计划任务主要是做一些周期性的任务&#xff0c;比如: 凌晨3点定时备份数据。或11点开启网站抢购接口&#xff0c;12点关闭抢占接口。计划任务主…