为什么MySQL死锁检测会严重降低TPS

在大量的客户端,更新数据表的同一行时,会造成数据库的吞吐量大幅降低。
很多数据库的前辈和同行分别通过实验和源码的方法,定位到了罪魁祸首----MySQL死锁检测
实验方式:http://blog.csdn.net/zhaiwx1987/article/details/6952285
源码方式:http://www.gpfeng.com/?p=426
请大家尤其注意这段代码
#####
lock_mutex_enter();
ut_ad(lock_table_has(thr_get_trx(thr), index->table, LOCK_IX));
err = lock_rec_lock(TRUE, LOCK_X | LOCK_REC_NOT_GAP,
block, heap_no, index, thr);
MONITOR_INC(MONITOR_NUM_RECLOCK_REQ);
lock_mutex_exit();
#####
可以看出,MySQL在试图获取锁期间,会有lock_mutex_enter 和lock_mutex_exit保护。
在一般情况下,lock_rec_lock执行速度很快,所以不成问题。
但是如果有大量锁等待的情况,比如多个客户端试图更新同一行,则这个过程非常缓慢。因此整个innodb层就由并行变成了串行,大幅降低TPS。
解决办法:
让锁等待尽量少,可以通过在数据库层设置等待队列达到这个效果,而OneSQL内置了这个方案。
测试用例:
update miaosha set mount=mount+1 where id=1;
测试环境
MySQL和OneSQL的关键参数配置如下,且均未开启binlog
| 数据库 | innodb_flush_log_at_trx_commit | innodb_log_file_size | innodb_buffer_pool_size |
| OneSQL | 1 | 1000M | 8G |
| MySQL | 1 | 1000M | 8G |
硬件环境
| 内存 | cpu | 磁盘 |
| 32g | 8c 每个core上有两个超线程 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz |
2块raid0 7500r |
测试结果:
在512个线程情况下,TPS为500/s
我实际测试,同样的环境下使用OneSQL,TPS可以达到15682/s,性能提升达30倍左右。

如有任何疑问,请联系微信onesoft007
为什么MySQL死锁检测会严重降低TPS的更多相关文章
- MySQL死锁检测和回滚
最近碰到“TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACT ...
- 谈谈MySQL死锁之二 死锁检测和处理源码分析
这一篇主要是通过一个实验来进行描述,过程是比较枯燥的. 实验准备 create table test_lock(id int auto_increment primary key ,stock int ...
- mysql行锁和死锁检测
行锁顾名思义,就是针对单行数据加锁,在mysql中,锁的实现是由引擎层实现的,MyISAM引擎就不支持行锁 不支持行锁就意味着并发控制只能使用表锁,也就是说同一时间,在这个表上只能有一个更新在执行,这 ...
- MySQL学习(四)死锁及死锁检测
文章图片来自参考资料 MySQL 的锁 根据加锁的范围,MySQL里面的锁大致可以分成全局锁.表级锁和行锁三类.我们需要明白锁的服务是为了数据统一,或者说是事务,数据隔离. 全局锁 全 ...
- MySQL 死锁问题分析
转载: MySQL 死锁问题分析 线上某服务时不时报出如下异常(大约一天二十多次):"Deadlock found when trying to get lock;". Oh, M ...
- mysql死锁问题分析
线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...
- mysql死锁问题
形成死锁的条件 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务. 问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时 ...
- mysql死锁问题分析(转)
线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...
- Mysql死锁问题解决方式 & 聚簇索引、隔离级别等知识
参考了这篇文章:http://www.cnblogs.com/LBSer/p/5183300.html <mysql死锁问题分析> 写的不错. 如果Mysql死锁,会报出: 1.1 死锁 ...
随机推荐
- [转]人人网首页拖拽上传详解(HTML5 Drag&Drop、FileReader API、formdata)
人人网首页拖拽上传详解(HTML5 Drag&Drop.FileReader API.formdata) 2011年12月11日 | 彬Go 上一篇:给力的 Google HTML5 训练营( ...
- vs自带iis局域网调试
http://www.cnblogs.com/liluping860122/p/4685564.html
- 转 Android学习笔记: 学习过程中碰到的一些问题及解决方法
在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描 ...
- Python3基础 print与,结合 一次输出多个数据
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 无法为表空间 XX 中的段创建 INITIAL 区
select * from dba_data_files where TABLESPACE_NAME='XX'--找到表空间文件 alter database datafile '/opt/app/o ...
- Linux的启动过程
Linux的启动过程,也就是Linux的引导流程,这部分主要是理论知识. Linux的开机启动过程 1.1第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
- MyBatis环境搭建
什么是MyBatis: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架(O object R relatoin M mapping 框架),MyBatis 避免了几 乎所 ...
- iOS各版本特性
iOS1 最大特性是具有其他手机无法比拟的触屏功能,使捏拉缩放和慢性滚动变得近乎完美.从而使应用的体验变得更加自然而即时. 缺点:1.不支持复制/粘贴文本. 2.无法在发邮件时添加附件. ...
- UVA 1452 八 Jump
Jump Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practi ...
- C# 返回Foreach集合
IEnumerable<DataRow> DetailRows() { foreach (DataRow dr in EditData.Tables[tb_ ...