数据有序_详解数据库插入性能优化:合并+事务+有序数据进行INSERT操作

概述

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

其实最有效的办法是:合并+事务+有序数据进行INSERT操作。下面用实验来测试说明一下。


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

常用的插入语句如:

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

修改成:

INSERT INTO`t1`(`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万条数据记录。

fe15f94eecd2e811804ee22f52b5f4a6.png

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

把插入语句放到一个事务里面:

START TRANSACTION;INSERT INTO `t1` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `t1` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);...COMMIT;

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

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

8cd09df6dff70280bc057454c786b3c7.png

3、数据有序插入

数据有序的插入是指插入记录在主键上是有序排列,这里假设datetime是记录的主键:

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

修改成:

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

由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。我们可以参照innodb使用的B+tree索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

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

47209f9757972a92583344dcc9764bf0.png

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


性能综合测试:

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

ed049b8573883800aefa78dcbcc3aab1.png

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


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

3ae94f214d004ca3c1213eaaec7cc01c.gif

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

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

相关文章

容器内应用日志收集方案

容器化应用日志收集挑战 应用日志的收集、分析和监控是日常运维工作重要的部分,妥善地处理应用日志收集往往是应用容器化重要的一个课题。 Docker处理日志的方法是通过docker engine捕捉每一个容器进程的STDOUT和STDERR,通过为contrainer制定不同log dri…

python统计行号_利用Python进行数据分析(第三篇上)

上一篇文章我记录了自己在入门 Python 学习的一些基础内容以及实际操作代码时所碰到的一些问题。这篇我将会记录我在学习和运用 Python 进行数据分析的过程:介绍 Numpy 和 Pandas 两个包运用 Numpy 和 Pandas 分析一维、二维数据数据分析的基本过程实战项目【用 Pyt…

lnmp架构搭建—源码编译(nginx、mysql、php)

含义及理解: LNMP LinuxNginxMysqlPHP:LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指P…

解析xml_Mybatis中mapper的xml解析详解

上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。基础介绍回顾下之前是在分析configuration的初始化过程,已经进行到了最后一步mapperElement(root.evalNode("mappers"))&#x…

lnmp—MemCache的作用

含义及理解: 1 . memcache是一个高性能的分布式的内存对象缓存系统,用于动态web应用以减轻数据库负担。通过在内存里维护一个统一的巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。 memcache是一…

openresty—实现缓存前移

含义及理解: OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。 其目标是让Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型&am…

Nginx+Keepalived+Tomcat之动静分离的web集群

NginxKeepalivedTomcat之动静分离的web集群 博客分类: webserverNginxKeepalivedTomcat之动静分离的web集群为小公司提供大概一天持续在100万/日之间访问的高性能、高可用、高并发访问及动静分离的web集群方案NginxKeepalived 高可用、反向代理NginxPHP …

安装完成后的配置_cent os7 默认安装后的一般配置

在安装cent os7后,进入系统会出现一些命令无法执行。这是因为最小化没有安装包含的软件包。这时候先要配置一下基本的IP参数,(包括动态,静态,或者是双网卡绑定)。我们在虚拟机中模拟操作一下,配置文件在/etc/sysconfig…

lnmp构架——对tomcat详解

tomcat的安装部署 安装jdk和tomcat tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/做好软连接便于访问 cd /usr/local ln -s jdk1.7.0_79/ java ln -s apache-tomcat-7.0.37/ tomcat配置环境变量 vim /etc/profile…

zabbix监控部署 与添加主机

zabbix介绍: zabbix([zbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决…

打开是什么样子的图片_情侣头像 | 无论是什么样子的你 我都好喜欢

点击【情侣图片大全】- 右上角找到【…】立刻设我为星标/置顶 - 不迷路哦情侣图片大全“时光真疯狂,我一路执迷与匆忙”情侣/闺蜜/动漫/闺蜜网名长按图片保存 点击图片放大图片高清,建议在 W i f i 下浏览这个世界是多么神奇我竟然遇见了你无论是什么…

zabbix监控平台添加服务(http,nginx,mysql)

1 . 监控httpd服务: 首先确保已经搭建zabbix监控平台,并且将需要监控的主机已经添加。 对主机server2 上的http服务进行监控,首先确保server2主机安装了http服务。 使用http在zabbix中自带监控模版 点击配置->主机->server2->模…

zabbix使用JMX监控tomcat

JMX 全称是Java Management Extensions,即Java管理扩展。Java程序会开放一些端口,用来获取运行状况。 从Zabbix2.0开始,内置了监控JMX的功能,叫做"Zabbix Java Gateway ",在Zabbix Serve上会启动名为"Zabbix Java Gateway "的进程&…

自定义控件添加属性_|AutoCAD LT 2019 Mac自定义功能区的方法

AutoCAD LT是一款非常好用的CAD三维设计绘图软件,最新版本2019拥有改进的桌面、新应用实现跨设备工作流,以及DWG比较等新功能,并且AutoCAD LT 2019 Mac可以根据你的需要和工作习惯来自定义功能区,下面为大家带来自定义功能区的详细…

Zabbix监控——proxy 分布式监控配置

proxy分布式监控 Zabbix proxy是在大规模分布式监控场景中,采用的一种用以分担server端压力的分层结构, proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,极大的减轻了server的负载压力,使…

AutoCAD_acadiso.dwt卡死

2019独角兽企业重金招聘Python工程师标准>>> 问题描述:每次执行到打开acadiso.dwt就卡死,且电脑显示有网,确打不开网页 可能原因:可能是因为AotuCAD是盗版的 解决办法: 1.在任务管理器中把WSCommCntr.exe进…

docker简介与搭建

1 . 对docker的理解: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间…

007_Web to lead

转载于:https://www.cnblogs.com/bandariFang/p/6229491.html

设置header_Nginx的这些安全设置,你都知道吗?

Nginx 是最流行的 Web 服务器,可以只占用 2.5 MB 的内存,却可以轻松处理 1w 的 http 请求。做为网站的入口,Nginx 的安全设置重要性不言而喻。下面带你一起去认识一下这些安全配置吧!nginx.conf是 Nginx 最主要的配置文件&#xf…

ISP运营商实验室测试机架拓扑搭建经验分享

大家好,有些日子没更新干货了,近期难得有假期进行修整,思前顾后还是坐下来聊聊自己长期负责维护和搭建的实验室环境。废话不多说,直接上图。因为图较大,分上下部分进行上传。网络主框架(上)服务…