MySQL · 引擎新特性 · 可开关的InnoDB死锁检测

在数据库系统中,死锁问题几乎是不可避免的,一般要么是资源互相占用导致,或者是系统内部的锁升级(在innodb内尤其普遍),尤其是糟糕的未经审查的SQL设计通常是导致死锁的元凶。在MySQL InnoDB引擎中,死锁的检测是通过深度遍历进行的,每一个需要等待的行锁请求都需要去检测是否可能产生死锁。

关于InnoDB事务锁,可以参阅我之前的一篇博客,这里不展开讨论:MySQL · 引擎特性 · InnoDB 事务锁简介

死锁检测是一个成熟的数据库系统必不可少的功能,但是!如果我们的应用SQL经过了充分合理的设计和验证,能够杜绝绝大部分死锁场景,这样的开销是否是可以避免的呢?

一个典型的场景是秒杀,也就是大量更新落到同一行记录上,此时大量请求同一个记录的排他行锁,导致了很长的等待队列,而死锁检测会去查询整个队列,而在整个过程中,一些全局资源(如lock_sys mutex)会被持有。为了避免检测深度过长的问题,InnoDB默认的最大检测深度为200,当超出时,会打印出死锁信息并结束死锁检测。

在阿里秒杀的场景随处可见,事实上在2012年双十一之前,我们修改MySQL的第一个补丁就是关闭死锁检测,代码量很小,就那么几行代码,带来的效果还不错。(当然这只是我们优化秒杀高并发负载场景下的第一步,远不能满足这几年的业务需求,后来我们进行了一系列的优化措施来改善MySQL以满足需求,我的同事们在不同的场合都提到过,这里我不展开说了)

在MySQL5.7.15版本开始,以及MySQL8.0.0版本,终于把这个特性加上了,增加了新的开关innodb_deadlock_detect来禁止死锁检测。

这里简单的测试下,MySQL版本为8.0.0(在该版本刚发布就把自己的5.7测试环境覆盖掉了,懒得重装了..),使用sysbench,autocommit的单行更新

关键配置:

innodb_thread_concurrency = 32
sync_binlog = 1000
innodb_flush_log_at_trx_commit = 2

测试数据为TPS(RT ms):

Threads Turn On Turn Off
16 8200(2.0ms) 8300(2.03ms)
32 7900(4.32ms) 8100(4.23ms)
64 7600(9.21ms) 7800(9.13ms)
128 4950(28.7ms) 7200(19.28ms)
256 1870 (147.8ms) 6145(48.8ms)
512 442 (1169ms) 4389(129.9ms)
1024 78 (16000ms) 3000(385ms)

从测试可以看到,低并发下基本上性能没啥并发,而在高并发下,TPS和RT则有明显的改善。在该测试中,当达到1024个并发时,实例已经完全不可用了,但关闭死锁检测后,实例依然能够提供3k的TPS

需要注意的是,你必须谨慎的使用这个功能,最好在满足几个条件才应去尝试:

  1. 你的业务需要确保死锁极少
  2. 你的业务确实有这方面的需求,经过充分的测试并确实能获得提升
  3. 如果非要开启这个功能,当真的发生死锁时,只能到锁等待超时才能回滚,因此记得调小innodb_lock_wait_timeout
时间: 2024-12-23 07:38:30

MySQL · 引擎新特性 · 可开关的InnoDB死锁检测的相关文章

Epic公布虚幻3引擎新特性画质逼真紧追CG

11月25日,Epic公布了一段虚幻3引擎的最新视觉特效的演示视频,同时放出了最新版的UDK(Unreal Development Kit 虚幻开发包). 虚幻3引擎(Unreal Engine 3)又称虚幻引擎3,是一套为DirectX 9/10 PC.Xbox 360.PlayStation 3平台准备的完整的游戏开发构架,提供大量的核心技术阵列,内容编辑工具,支持高端开发团队的基础项目建设. 目前使用虚幻3引擎开发的著名游戏有: <战争机器>(Gears of War)(欧美-Epic

迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(中)

作者介绍  杨奇龙 前阿里数据库团队资深DBA,主要负责淘宝业务线,经历多次双十一,有海量业务访问DB架构设计经验. 目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化,故障诊断,性能压测.   一.innodb新特性   前面写了一篇文章介绍innodb的特性,囿于相关知识点比较多 ,本文继续介绍5.7版本的innodb新特性. 1. innodb buffer dump 功能增强       MySQL 5.7.5 版本新增innodb_buffer_pool_dump_pct参

【MySQL】5.7新特性之四

写在前面  本系列文章基于5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.前面写了一篇文章介绍 innodb 的特性,囿于相关知识点比较多 ,本文继续介绍5.7版本的innodb 新特性.4.1 innodb buffer dump 功能增强            5.7.5 新增加innodb_buffer_pool_dump_pct参

【MySQL】5.7新特性之七

写在前面   本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.本文主要研究5.7 复制方面的改进和优化.7.1 Lock_log 锁优化  主从复制过程中,拉取主库的binlog 的时候有一把大锁 , 在 5.7.12 之前,dump thread读取binlog event事件的时候会持有锁,最严重的是client 的

【MySQL】5.7新特性之五

一 写在前面   本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.本文将重点介绍新版本对JSON格式的支持.5.1  支持JSON   从MySQL 5.7.8 开始,MySQL支持原生的JSON格式,即有独立的json类型,用于存放 json格式的数据.JSON 格式的数据并不是以string格式存储于数据库而是以内部

【MySQL】5.7新特性之六

写在前面  本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.6.1  优化(工具方面)增强  5.7 版本中如果一个会话正在执行sql,且该sql 是支持explain的,那么我们可以通过指定会话id,查看该sql的执行计划. EXPLAIN [options] FOR CONNECTION connection_id

【MySQL】5.7新特性之一

写在前面    MySQL 5.7版本于2015年10月份左右 GA,至今已经半年多了,但自己一直没有时间来follow MySQL 5.7 新的特性,作为MySQL DBA 实在汗颜,以后会花时间来研究5.7 版本的特性并针对部分优化功能做出压力测试.本系列基于5.7.12 版本来讲述MySQL的新特性,同时也建议大家跟踪官方blog和文档,以尽快知悉其新的变化. 一 安全性    MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有

【MySQL】5.7新特性之二

本系列基于5.7.12 版本来讲述MySQL的新特性,从安装,文件结构,SQL  ,优化 ,运维层面 复制,等几个方面展开介绍5.7 的新特性和功能,同时也建议大家跟踪官方blog和文档,以尽快知悉其新的变化.1 SQL_MODE的变化 官方文档上表述, 5.7 版本默认的SQL_MODE="ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_

【新特性】MySQL5.7新特性query_rewrite 插件

一.使用场景 在业务繁忙并且紧急上线,对就是那种特别繁忙,又不能停的那种.在系统不忙的时候 明明跑的很好.但是一旦业务繁忙,造成业务阻塞.当查看MySQL的满查询日志中发现大量慢查询日志,(不是单单加索引就能搞定的哦).这时候怎么办,难道怒对开发一顿,这时候你需要MySQL5.7新特性query_rewrite _Plugin插件了.二.安装配置插件 2.1安装 [root@localhost share]# /usr/local/mysql/bin/mysql -u root -p < ins