MYSQL开发性能研究——INSERT,REPLACE,INSERT-UPDATE性能比较
一、为什么要有这个实验
我们的系统是批处理系统,类似于管道的架构。而各个数据表就是管道的两端,而我们的程序就类似于管道本身。我们所需要做的事情无非就是从A表抽取数据,经过一定过滤、汇总等操作放置到B表。如果出现了错误,那么就从重新跑这一个管道。所以说,我们的系统其实根本就不要什么事务性,无非就是挂了把表给TRUNCATE(或者有条件地DELETE)一下,然后重跑就行了。
这样一来,对于select语句就相对比较容易,基本上不需要做JOIN操作。然而对于写操作就有一些要求。比如说,需要处理主键重复(可能之前跑挂了,现在需要重跑,到底是提示错误呢,还是做个REPLACE或者UPDATE)等等问题。
在引入了MYSQL之后,我们发现MYSQL在SQL语句层面就提供了对于类似问题的解决。包括了INSERT,REPLACE,INSERT-ON-DUPLICATE的操作。具体的说明请查看这里。唯一需要注意的是INSERT-ON-DUPLICATE这个操作,在UPDATE里面的VALUES的含义是INSERT列表里的那个固定值,如果需要引用数据表中原来的值,还是直接使用列名即可,无需用VALUES包装一下。
二、实验准备
我仍然是采用了在我们这里可能用到的最大的表,该表有近200个字段。实验环境也和上一篇文章中的一样。有了那篇文章中的比较,我就直接使用了10条多行插入的方法,也是每5000条提交一次。为了做个比较,我特意制作了一个传统的INSERT-UPDATE操作。该操作先进行INSERT插入动作,然后检查输出,如果是出现了“主键重复”的错误,那么直接调用UPDATE语句,用相同的数据替换那行(就是直接原值覆盖)。注意,这种办法是没有办法做到多行插入的。
同样,为了让场景更加真实。我在同一个MYSQL服务上创建了三个数据库,其中都创建了该表。而且所有的操作都直接针对该三张表进行。我在代码里使用的工具是我自己写的一个类库。通过多线程连接到多库(一库一连接)然后主线程向所有线程发送一句INSERT/REPLACE/INSERT-UPDATE/INSERT-ON-DUPLICATE-KEY命令,等待所有线程都返回继续向下。所有的COMMIT操作都是线程主动根据AFFECTED ROWS的累积量自己选择做。
再强调一下,机器很烂,TPS没有意义。只是看个趋势。
三、实验结果
说明:
- 多行INSERT空表——使用”INSERT INTO … VALUES (..), (..), (..), … “的方式往一张空表里面插入数据。
- INSERT-UPDATE——在上一步骤的基础上,该操作先进行INSERT插入动作(一条一条INSERT),然后检查错误输出,如果是出现了“主键重复”的错误,那么直接调用UPDATE语句,用相同的数据替换那行(就是直接原值覆盖)。
- 多行REPLACE空表——使用“REPLACE INSERT INTO … VALUES (..), (..), (..), … ”的方式往一张空表里面插入数据。
- INSERT-DUPLICATE——使用 INSERT INTO .. VALUES (..), (..), (..), … ON DUPLICATE KEY UPDATE …”的语法在上一步骤的基础上进行操作。

结论如下:
- 对于空表操作,REPLACE的性能和INSERT的差不多,但是他还有一个额外的好处,就是可以进行覆盖操作。这就给了我们一点提示,如果我们真的不用去关心DUPLICATE KEY错误,而且希望做到覆盖效果,那么使用REPLACE真心不错;如果不用关心DUPLICATE KEY错误,同时也不想要覆盖,那么INSERT IGNORE更好。
- 传统的INSERT-UPDATE方式真心慢,理解起来也不复杂,送过去-返回来-再送过去-再返回来。还是改用INSERT-ON-DUPLICATE-KEY-UPDATE吧。
MYSQL开发性能研究——INSERT,REPLACE,INSERT-UPDATE性能比较的更多相关文章
- Mysql INSERT、REPLACE、UPDATE的区别
用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSE ...
- MySQL 当记录不存在时insert,当记录存在时update(ON DUPLICATE KEY UPDATE, REPLACE语句)
MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法. 第一种:示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语 ...
- MySQL优化--INSERT ON DUPLICATE UPDATE死锁
INSERT ON DUPLICATE UPDATE与死锁 在MySQL中提供两种插入更新的方式:REPLACE INTO和INSERT ON DUPLICATE UPDATE,简化了“存在则更新,不 ...
- 【转】MySQL 当记录不存在时insert,当记录存在时update
MySQL当记录不存在时insert,当记录存在时更新:网上基本有三种解决方法 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句 ...
- MySQL 当记录不存在时insert,当记录存在时update
MySQL当记录不存在时insert,当记录存在时更新:网上基本有三种解决方法 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句 ...
- MYSQL开发性能研究——批量插入的优化措施
一.我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句. INSERT INTO TBL_TEST (id) VALUES(1); 很显然,在MYSQL中,这样的方 ...
- MySQL 详细解读undo log :insert undo,update undo
转自aobao.org/monthly/2015/04/01/ 本文是对整个Undo生命周期过程的阐述,代码分析基于当前最新的MySQL5.7版本.本文也可以作为了解整个Undo模块的代码导读.由于涉 ...
- 【MyBatis源码分析】insert方法、update方法、delete方法处理流程(下篇)
Configuration的newStatementHandler分析 SimpleExecutor的doUpdate方法上文有分析过: public int doUpdate(MappedState ...
- 【mysql】Innodb三大特性之insert buffer
一.什么是insert buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,当受影响的索引页不在buffer pool时缓存 secondar ...
随机推荐
- paip.提升中文分词准确度---新词识别
paip.提升中文分词准确度---新词识别 近来,中文每年大概出现800---1仟个新的词.. 60%的分词错误是由新词导致的 作者Attilax 艾龙, EMAIL:1466519819@qq. ...
- 更新日志 - BugHD 与你的应用一起成长
上周 BugHD Android客户端上线了,下载地址在此,欢迎大家体验并提出反馈.本周增加 BugHD 和 fir.im 的新功能,同时也做出一些体验优化. BugHD 新增功能 1.新增安装量.启 ...
- Spring简介和基础
Spring介绍 1.什么事Spring? spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. spring的设计模式是单例模式和工厂模式. 2.spring的四大优点 轻量 ...
- [推荐]DataX、DbSync和Timetunnel学习贴
[推荐]DataX.DbSync和Timetunnel学习贴 一 DataX 二 DbSync 三 Timetunnel TimeTunnel :http://code.taobao.org/p/T ...
- Redis info参数总结(转)
Redis官网对 info 已经讲解的比较清楚的,参考文档 . 可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一 ...
- Node.js的颠覆者:PHP的Swoole扩展
最近2年Node.js很火,异步与协程是网络开发方面热门的话题.在追求新技术的同时,也应该反思下这里面存在的陷阱.Node.js确实是一门有趣好玩有个性的语言和技术,动态性,全异步回调的方 ...
- [转]PROE传动链条的装配教程
转自: 原文连接:PROE动链条的装配教程 传动链条的装配
- mysql5.5 uuid做主键与int做主键的性能实测
数据库:mysql5.5 表类型:InnoDB 数据量:100W条 第一种情况: 主键采用uuid 32位. 运行查询语句1:SELECT COUNT(id) FROM test_varchar; 运 ...
- WHY翻写NEHE与红龙的3D图形程序 [开源]
个人认为学习3D图形程序开发,有两套经典教程.D3D的<D3D游戏开发编程基础>也就是红龙那本书.OpenGL的NEHE教程.为向经典致敬,将我之前翻写他们的程序开源. 我所做的工作是将其 ...
- Ubuntu server下搭建Maven私服Nexus
Ubuntu server下搭建Maven私服Nexus Maven私服Nexus的作用,主要是为了节省资源,在内部作为maven开发资源共享服务器来使用. 1.下载 通过root用户进去Ubuntu ...