MySQL 热点数据更新的秒杀级性能优化
回答
-
库存拆分:将大库存拆分为多个小库存,使扣减动作分散到不同库和表,降低锁粒度提升并发。
- 优点:实现相对简单。
- 缺点:存在数据碎片化问题,库存统一调控难度增加。
-
请求合并:把多个库存扣减请求,合并为一个进行批量更新。
- 优点:操作简单。
- 缺点:适用于允许一定延迟的异步场景,或经分析可合并的场景 。
-
update 转换为 insert:直接插入占用记录,通过异步统计或 SQL 统计流水方式计算剩余库存。
- 优点:避免 update 带来的锁冲突问题。
- 缺点:插入时若控制不当易超卖,插入后剩余库存统计较复杂 。
-
改造 MySQL:开启热点更新自动探测,若探测到单行热点更新,让大量并发的
update排队执行,减少行锁导致的并发性能下降。-
优点:开发人员无需额外操作,只需开启热点检测。
-
缺点:改造 MySQL 数据库存在成本。
-
相关支持:
腾讯云数据库 MySQL 热点更新(链接:cloud.tencent.com/document/pr… )、
阿里云数据库 Inventory Hint(链接:www.alibabacloud.com/help/zh/aps… )
-
MySQL 批量更新的具体实现
1. 方案原理
- 将实时并发操作转变为批量处理,减少数据库压力,提高处理效率。
2. 实现步骤及代码示例
- 收集和汇总积分
- 创建临时表
- 每当有积分变更,向该表插入记录
- 定期更新用户积分表:
- 每隔一定时间(如 10 分钟,可缩短),通过 SQL 脚本或计划任务(如 xxl-job)汇总
pending_points表积分并更新到users表,同时清空已处理记录。
- 每隔一定时间(如 10 分钟,可缩短),通过 SQL 脚本或计划任务(如 xxl-job)汇总
- 注意事项
- 此方案需考虑任务失败后的补偿等问题。