- 文档首页
云数据库 MySQL 版
内核功能
性能
热点高并发更新
热点高并发更新
本文介绍云数据库 MySQL 版提供的热点高并发更新功能的相关信息。
背景信息
秒杀场景是实际业务中常见的一种业务场景,对于数据库而言,这个场景的特点就是大量并发针对同一行数据进行更新。热点数据更新的核心问题在于行锁的冲突,为了解决这个问题,云数据库 MySQL 版采用了相同热点行的更新批量执行的方式。对于带有热点更新标识的 SQL 进入数据库后,数据库会对更新相同数据的 SQL 进行合并处理,从而提升热点高并发更新的性能。
支持版本
- MySQL 5.7 版本,内核小版本为 MySQL 5.7.32_20241215 及以上。
- MySQL 8.0 版本,内核小版本为 MySQL 8.0.32_20230615 及以上。
- MySQL 8.4 版本,内核小版本为 MySQL 8.4.7_20260415 及以上。
使用限制
- 不支持带有 OFFSET/LIMIT/ORDER BY 的 UPDATE 语句。
- 在事务块中使用秒杀,秒杀语句必须是事务块中最后一条 SQL 。
- UPDATE 列中不能包含主键和当前使用的索引列,除非 where 条件完全命中索引。
- 云数据库 MySQL 版的 8.0.26 版本序列的实例暂不支持该功能。
使用说明
- 用户使用 SQL HINT 的方式指定秒杀更新操作,HINT 关键字为 LOGIC_UPDATE:
update t_stock set num = num - 1 where id = X and num > 0;
- 上述的批量执行设计只能支持非事务块的热点更新操作。如果需要在事务中使用秒杀,需要增加 HINT 关键字 AUTO_LOGIC_COMMIT_ROLLBACK,而且需要把热点更新的 SQL 作为事务的最后一条 SQL。带了这个 HINT 以后,数据库会根据 UPDATE 是否成功来主动提交或者回滚事务。
insert into t_order(userid, stockid, num) values(X, X, X);
update t_stock set num = num - 1 where id = X and num > 0;
性能测试
测试环境为 MySQL 5.7 版本,48 C 502 GiB 实例。
CREATE TABLE sbtest(id INT UNSIGNED NOT NULL AUTO_INCREMENT, c BIGINT UNSIGNED NOT NULL, PRIMARY KEY (id));
UPDATE sbtest SET c=c-1 WHERE id = 1;
测试结果如下。可以看出在没有使用热点更新优化时,QPS 会随着并发增大而急剧下降;而打开优化后,QPS 可以保持稳定。
最近更新时间:2026.08.27 11:24:30