87
社区成员




在“秒杀”和“限时抢购”等这样的场景下,大量用户在极短时间内请求大量商品。而体现在 MySQL 数据库中,同一商品在数据库里肯定是一行存储,所以会有大量的线程来竞争 InnoDB 行锁,当并发度越高时等待的线程也会越多,TPS 会下降 RT 会上升,数据库的吞吐量会严重受到影响。本文档描述 MariaDB 解决“秒杀”和“限时抢购”所做的特殊优化——热点更新技术。
热点更新:采用如下示例语句对某个数据对象频繁进行更新。
目前仅支持 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
UPDATE 和 INSERT 的 SQL 语句可以增加新关键字,以表达热点更新的功能,红色为新增内容。
- 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]
-
- [ORDER BY ...]
-
- [LIMIT row_count]
- INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY]
-
- [COMMIT_ON_SUCCESS] [ROLLBACK_ON_FAIL] [QUEUE_ON_PK expr]
-
- [IGNORE]
-
- [INTO] tbl_name
-
- [PARTITION (partition_name,...)]
-
- [(col_name,...)]
-
- {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
-
- [ ON DUPLICATE KEY UPDATE
-
- col_name=expr
-
- [, col_name=expr] ... ]
QUEUE_ON_PK
指定的 expr 的值的对象,实施热点更新功能,通常 expr 的值是一个正整数值。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,表示只有一行受到影响。
······