为什么MySQL 8.0对锁子系统的重构提升了高核服务器性能?

胖丽小哥_9888

胖丽小哥_9888

2026-06-21

671人浏览

原创

mysql 8.0锁管理器通过拆分全局mutex为多细粒度锁(rec_hash/prdt_hash分片锁、wait_mutex等),显著缓解cpu核间争用;死锁检测改为持续追踪等待图,p99延迟降60%+;新增nowait/skip locked语法实现应用层锁行为主动控制。

为什么mysql 8.0对锁子系统的重构提升了高核服务器性能?

锁管理器从单 mutex 拆成多细粒度锁,缓解 CPU 核间争用

MySQL 5.7 的 lock_sys->mutex 是全局一把大锁,所有事务申请行锁、释放锁、检测死锁都得排队抢这一个资源。在 32 核服务器上,大量线程同时调用 lock_rec_lock() 或 lock_table_lock() 时,CPU 缓存行频繁失效(false sharing),导致大量核间同步开销——你看到的不是“慢”,是大量线程在 spin-wait 或 futex 等待中空转。

8.0 把它拆成:lock_sys->mutex(仅管哈希表元数据)、lock_sys->wait_mutex(管等待图维护)、rec_hash 和 prdt_hash 各自带独立分片锁。这意味着:热点行锁操作和死锁检测不再互锁,不同哈希桶上的行锁操作可并行执行。

  • 实测中,当 innodb_sync_array_size 保持默认 1(即 1 个 sync array)时,rec_hash 分片仍只有 1 个,性能提升有限;建议设为 4 或 8(需配合物理核数)
  • 若应用存在明显热点主键更新(如计数器表),且 performance_schema.data_locks 中某几个 LOCK_DATA 值反复高频出现,说明哈希分片不均,调大 innodb_sync_array_size 能立竿见影
  • 旧监控脚本若依赖 SHOW ENGINE INNODB STATUS 解析 LOCK WAIT 区块,会因输出格式变更直接失败——8.0 改用结构化字段(如 WAITING TRANSACTION, HOLDING LOCK)输出,必须重写解析逻辑

死锁检测从“按需扫描”变成“持续追踪”,降低锁等待抖动

5.7 的死锁检测是懒加载:只有事务卡在 innodb_lock_wait_timeout 边缘时,才触发一次全图遍历。结果就是——你看到的锁等待时间忽高忽低,有时 10ms 解决,有时卡满 50s 才回滚。

8.0 默认开启 innodb_deadlock_detect=ON,后台有专用线程持续维护等待图(wait-for graph)。只要形成环,毫秒内就选 victim 回滚。这不是“更快”,而是“更稳”:锁等待时间方差大幅收窄,P99 延迟可降 60%+(实测场景:订单状态机高频 UPDATE)。

  • 代价是 CPU 使用率小幅上升(约 +3%~5%,取决于并发事务数),但换来的是确定性响应——这对支付、库存类业务至关重要
  • 若你确认业务逻辑几乎不可能死锁(比如所有 UPDATE 都按固定字段顺序执行),可关掉它:SET GLOBAL innodb_deadlock_detect=OFF,再把 innodb_lock_wait_timeout 调小到 10~30 秒兜底
  • 注意:关闭后,INFORMATION_SCHEMA.INNODB_TRX 中的 TRX_WAIT_LOCK_ID 字段可能为空,别靠它判断阻塞链

MDL 锁升级更早、更严格,减少“DDL 卡住全部查询”的雪崩

5.7 的 MDL 锁允许 DML 插队:一个长事务开着,ALTER TABLE 会一直等,期间新来的 SELECT/INSERT 全被堵在 MDL 共享锁获取阶段,形成“一卡全卡”。8.0 强制 DDL 在第一步就申请 MDL_EXCLUSIVE,如果发现已有活跃事务持有 MDL_SHARED,立刻报错或超时,不排队。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

这看似“更严”,实则让问题暴露得更早、更可控。DBA 能快速定位是谁没提交事务,而不是查半天才发现是某个凌晨遗留的未关闭连接。

  • 检查当前阻塞源:SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS = 'PENDING'
  • FLUSH TABLES WITH READ LOCK 在 8.0 下直接被拒绝,备份脚本里还留着这句,会失败——改用 mysqldump --single-transaction 或 mysqlpump
  • 临时表也参与 MDL 管理,高频创建/删除临时表的应用(如报表引擎),要注意 metadata_locks_cache_size 是否够用,否则会触发频繁内存分配

NOWAIT 和 SKIP LOCKED 让应用层能主动控制锁行为

以前遇到行锁冲突,应用只能干等或靠 innodb_lock_wait_timeout 被动中断。8.0 提供两个 SQL 级控制开关,把锁决策权交还给业务逻辑。

SELECT ... FOR UPDATE NOWAIT 遇锁立即报错 ERROR 1205 (40001): Deadlock found when trying to get lock; try restarting transaction(实际是锁等待超时错误码,但语义明确);SELECT ... FOR UPDATE SKIP LOCKED 则跳过已锁定行,常用于任务队列消费,避免多个 worker 争同一行。

  • 订单分发场景典型写法:SELECT * FROM orders WHERE status = 'pending' ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED
  • 不要滥用 NOWAIT 做轮询——它会把锁冲突压力转移到应用层重试逻辑,应配合指数退避
  • SKIP LOCKED 不影响一致性,但注意它只跳过当前语句可见的已锁行;若事务中后续还有其它锁操作,仍可能触发死锁

真正难调的不是参数本身,是理解哪些锁瓶颈其实在应用层——比如一个没加索引的 UPDATE ... WHERE status='processing',在 8.0 上照样会锁全表,此时调 innodb_sync_array_size 毫无意义。先看 EXPLAIN,再看 data_locks,最后动内核参数。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

920

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2872

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

956

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

849

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

434

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2596

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4832

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

767

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 184人学习