如何通过MySQL锁分解技术解决单行热点数据的性能瓶颈?

小芳大大_3966

小芳大大_3966

2026-06-25

864人浏览

原创

update set x = x + 1在高并发下必然卡住,因innodb行锁强制串行化,所有事务排队争抢同一行x锁,超200–500 qps即引发锁等待飙升、上下文切换激增,而非cpu或io瓶颈;应改用redis原子操作+异步落库、insert on duplicate key update合并写或分桶分散热点。

如何通过mysql锁分解技术解决单行热点数据的性能瓶颈?

为什么UPDATE SET x = x + 1在高并发下必然卡住

因为 InnoDB 的行锁是真实串行化屏障:所有事务都得排队等同一行的 X 锁。哪怕只是加 1,只要并发请求超过单行吞吐极限(通常 200–500 QPS 就开始明显排队),innodb_row_lock_waits 就会飙升,Threads_running 暴涨但实际 QPS 却上不去。CPU 不一定高,但锁等待本身会触发频繁上下文切换和死锁检测开销。

常见错误现象包括:Lock wait timeout exceeded、慢日志里大量该语句耗时 >100ms、监控显示 innodb_row_lock_time_avg 持续升高。

别用 SELECT FOR UPDATE + 应用层计算再 UPDATE

这种三段式写法把锁持有时间从“写瞬间”拉长到“读 + 算 + 写全过程”,等于主动扩大锁范围。尤其当应用层做了 HTTP 调用、文件 IO 或复杂逻辑时,热点行被锁住的时间可能达数百毫秒甚至秒级,加剧排队雪崩。

更糟的是,它无法规避死锁检测负担——InnoDB 仍需为每个事务维护锁等待图,高并发下 innodb_deadlock_detect 会吃掉大量 CPU。

可行替代方案:

Twitter热点监控与推文生成
Twitter热点监控与推文生成

每小时自动在推特搜索中国、加密货币、国际热点、美国热点、特朗普等话题的热度信息,提取前十热点,依据 X 平台真实算法权重(开源代码数据)为每个热点生成高曝光推文或线程。用户提及“推特热点”“Twitter热点”“推特搜索”“热点推文”“生成推文”“社交媒体监控”“Twitter监控”等关键词时触发。

下载
  • 确认业务是否真需要强一致性:点赞数、点击量、埋点计数大多可接受最终一致
  • 改用乐观锁(带 version 字段)+ 重试,避免长期持锁
  • 直接跳过数据库读取,在应用或缓存层聚合后再批量落库

用 INSERT ... ON DUPLICATE KEY UPDATE 合并写请求

这是 MySQL 原生最轻量的“无显式锁合并写”方案,本质靠唯一键冲突触发更新,跳过 SELECT 加锁流程。适用于有 PRIMARY KEY 或 UNIQUE KEY(如 user_id)的计数表。

示例:

INSERT INTO user_counter (user_id, click_count) 
VALUES (123, 1), (456, 1), (123, 1), (789, 1) 
ON DUPLICATE KEY UPDATE click_count = click_count + VALUES(click_count);

关键点:

  • VALUES(click_count) 取的是当前这一行 INSERT 的值(即 1),不是整条语句所有值的总和
  • 不支持 WHERE 条件判断(比如“余额 > 100 才扣减”),只适合纯累加类场景
  • 单次批量建议控制在 100–500 行以内,避免超 max_allowed_packet
  • 必须有唯一约束,否则 ON DUPLICATE KEY UPDATE 不生效

用 Redis 原子操作 + 异步消费队列降频落库

当热点更新频率远超 MySQL 单行吞吐(例如每秒上千次同 key 更新),就必须把写操作前置到内存层。核心思路是:应用只往 Redis 的 LPUSH 推更新指令(如 JSON 字符串),后台常驻进程用 BRPOP 拉取、去重、聚合,再拼成一条 INSERT ... ON DUPLICATE KEY UPDATE 或 REPLACE INTO 刷入。

这个方案真正绕开了“多线程争抢单行”这个死结,但容易被忽略的细节是:

  • Redis 本身也要防止单 key 热点(比如用 user_id % 16 分桶)
  • 异步消费者必须幂等,且要处理消息丢失、重复、顺序错乱等边界情况
  • 落库延迟不可控,业务必须能容忍几秒到几十秒的数据不一致

相关文章

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

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

下载

相关标签:

mysql 热点 性能瓶颈

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2193

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1339

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2992

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5048

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1139

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5311

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4662

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6154

11

热门下载

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

精品课程

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

共1课时 | 184人学习