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 ...
随机推荐
- Leetcode 67 Add Binary 大数加法+字符串处理
题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...
- Couldn't create temporary file to work with
Ubuntu中当你编译安装软件的时候可能会出现Couldn't create temporary file to work with,原因可能是: 1.权限问题 2.根目录下没有tmp文件夹 解决办 ...
- echart.js的使用与API
---恢复内容开始--- echart.js的使用与API 1.echart.js的使用: 第一步:在head标签或body下创建一个script标签去引用echart.js,(该文件可以在echar ...
- 关于C++ const 的全面总结
http://blog.csdn.net/Eric_Jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
- Jquery EasyUI封装简化操作
//confirm function Confirm(msg, control) { $.messager.confirm('确认', msg, function (r) { if (r) { eva ...
- 開啟apache的日誌功能,但是不記錄.js;.css;.jpg;.ico;.png等訪問記錄
維護web伺服器最重要的就是要每天都關注網站的訪問日誌,但是每天面對幾百兆的日誌文件實在是非常頭大,所以可以從根源上給日誌減肥一下,讓日誌只記錄對自己有用的內容就變得非常重了. Nginx伺服器要修改 ...
- redis 学习指南
一.介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.一个高性能的key-value数据库.并提供多种语言的API.说到Key-Value数据库NoSQL数 ...
- 滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面
SwipeBackLayout是一个很好的类库,它可以让Android实现类似iOS系统的右滑返回效果,但是很多用户在使用官方提供的Demo会发现,可能出现黑屏或者返回只是看到桌面背景而没有看到上一个 ...
- 利用EEPROM实现arduino的断电存储
转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.EEPROM简介 EEPROM (Electrically Erasable Progr ...
- Codeforces Round #382 (Div. 2) D. Taxes 哥德巴赫猜想
D. Taxes 题目链接 http://codeforces.com/contest/735/problem/D 题面 Mr. Funt now lives in a country with a ...