tencent cloud

云数据库 MariaDB

动态与公告
产品动态
产品简介
产品概述
产品优势
应用场景
系统架构
实例类型
实例架构
分布式版本
数据库版本
购买指南
计费概述
产品定价
退费说明
欠费说明
升级计费
备份空间计费
快速入门
创建实例
管理账号
连接实例
操作指南
使用前须知
实例管理
灾备/只读实例
账号管理
读写分离
修改网络
备份与回档
数据迁移
数据库同步(旧版)
安全管理
监控与告警
KILL 线程
参数模板与设置
数据库审计
实践教程
编程与使用规范
分布式版本编程与使用规范
利用热点更新技术应对秒杀场景
安全白皮书
平台侧安全设计
租户侧安全功能
开发指南
功能限制
性能检测
同城双活解决方案
Binlog 日志消费格式
慢查询分析
数据库审计
数据库审计已支持语法
API 文档
History
Introduction
API Category
Making API Requests
Security Group APIs
Other APIs
Account APIs
Parameter Management APIs
Monitoring Management APIs
Instance Management APIs
Backup and Restoration APIs
Data Types
Error Codes
常见问题
产品常见问题
账号登录问题
功能相关问题
性能相关问题
备份相关问题
运维相关问题
磁盘超用问题
IO 类监控项异常问题
通用参考
标准与认证
主要规格性能说明
强同步性能对比数据
词汇表
文档云数据库 MariaDB实践教程利用热点更新技术应对秒杀场景

利用热点更新技术应对秒杀场景

PDF
聚焦模式
字号
最后更新时间: 2025-07-16 18:09:23

1 引言

1.1 背景

在“秒杀”和“限时抢购”等这样的场景下,大量用户在极短时间内请求大量商品。而体现在 MySQL 数据库中,同一商品在数据库里肯定是一行存储,所以会有大量的线程来竞争 InnoDB 行锁,当并发度越高时等待的线程也会越多,TPS 会下降 RT 会上升,数据库的吞吐量会严重受到影响。本文档描述 MariaDB 解决“秒杀”和“限时抢购”所做的特殊优化——热点更新技术。

1.2 使用简介

热点更新:采用如下示例语句对某个数据对象频繁进行更新。 目前仅支持 Percona 5.7.17 版本,可在 MariaDB 购买页 购买。
UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 88 TARGET_AFFECT_ROW 1 table_name SET k=k+1 WHERE id=88

2 UPDATE 和 INSERT 语法变化

UPDATE 和 INSERT 的 SQL 语句可以增加新关键字,以表达热点更新的功能,红色为新增内容。

2.1 UPDATE 语法

UPDATE [LOW_PRIORITY]
[COMMIT_ON_SUCCESS] [ROLLBACK_ON_FAIL] [QUEUE_ON_PK expr1] [TARGET_AFFECT_ROW expr2]
[IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]

2.2 INSERT 语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY]
[COMMIT_ON_SUCCESS] [ROLLBACK_ON_FAIL] [QUEUE_ON_PK expr]
[IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]

2.3 说明

1. UPDATE 只支持单对象更新,即支持 single-table-syntax,不支持 multiple-table-syntax。
2. 只支持单机场景,XA 场景之后的迭代版本由 proxy 实现。
3. INSERT 的三种语法都支持,这里只列举一种。
4. 标准语法参考官方标准:UPDATE SyntaxINSERT Syntax
1. QUEUE_ON_PK指定的 expr 的值的对象,实施热点更新功能,通常 expr 的值是一个正整数值。
2. 参数含义:
COMMIT_ON_SUCCESS:更新操作成功后,立即提交。适合单语句作为一个事务。
ROLLBACK_ON_FAIL:更新操作失败后吗,立即回滚。适合单语句作为一个事务。
QUEUE_ON_PK expr:指定热点更新对象,对被更新的对象封锁和解锁。被更新的对象总数不超过hot_commodity_query_size,即,具有不同值的 expr 的个数不超过hot_commodity_query_size。expr 取值自由,但建议与主键保持一致,也可以不一致。
TARGET_AFFECT_ROW expr:指定热点更新影响的数据行。expr 是一个正整数([1, MAX], MAX 是 8 位正数的最大值)。通常 expr 为 1,表示只有一行受到影响。

2.4 建议

使用时,只在单语句事务中增加全部新增的参数使用。
UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 88 TARGET_AFFECT_ROW 1 table_name SET k=k+1 WHERE id=88

2.5 示例

CREATE DATABASE hc_db;

CREATE TABLE hc_tbl(a INT PRIMARY KEY, b INT, c INT);

CREATE TABLE hc_tbl_2(a INT PRIMARY KEY, b INT, c INT);

2.5.1 INSERT 示例


INSERT COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 1 INTO hc_tbl VALUES(1, 1, 1);

INSERT COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 1 INTO hc_tbl SET a= 2;

INSERT COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 1 INTO hc_tbl_2 SELECT * FROM hc_tbl;

2.5.2 UPDATE 示例

UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 1 TARGET_AFFECT_ROW 1 hc_tbl SET b= b+1 WHERE a = 1;

QUEUE_ON_PK exprexpr 不一定和 WHERE clause 中的值一致

UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 2 TARGET_AFFECT_ROW 1 hc_tbl SET b= b+1 WHERE a = 1;

3 新增参数说明

参数名
功能
类型
默认值
其他
hot_commodity
_enable
控制热点更新功能的开闭
布尔型
true 打开热点更新功能
运行中关闭此参数,新的事务不再使用热点更新。最好是系统启动前就设置好,而不是运行时改变
hot_commodity
_trace
控制跟踪功能的开闭
布尔型
false 关闭跟踪功能
打开时,跟踪信息会输出到标准输出
hot_commodity
_query_size
控制允许对多少个热点更新对象进行更新/插入操作
数值型
10000
起到限流的作用
hot_commodity
_query_size_modify_enable
控制能否修改
hot_commodity_query_size
布尔型
false 不允许修改hot_commodity
_query_size
方便在单元测试中改
hot_commodity_query_size
注意:
如果 MySQL server 启动的时候,参数hot_commodity_enable是关闭的,则需要设置其为打开,重新启动 server,才能初始化全局的数据对象表。但如果hot_commodity_query_size值为 0,即使打开了hot_commodity_enable,也不能使用热点更新。所以热点更新功能需要同时设置:
hot_commodity_enable=ON
hot_commodity_query_size=10000 为一个大于 0 的数值,建议控制在 10000、20000 左右,需要根据硬件环境和应用压力等实际情况测试确定其适合的值。
启动 server。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈