MySQL的点数热点数据更新问题,一直都是据高行业内的一个难题,对于秒杀场景至关重要。效更新一旦处理不好,点数就可能会导致数据库被打垮。据高 通常来说,效更新对于热点问题,点数都是据高选择使用Redis来抗,比如秒杀场景借助他的效更新单线程高并发能力来做预扣减。 
常规方案但是点数,引入Redis又会带来数据不一致的据高问题,进而会导致超卖和少卖,效更新如果一定要在MySQL这个层面上,点数抗住高并发的据高热点数据并发更新,有什么方案呢?效更新拿库存扣减举例 1、库存拆分,把一个大的库存拆分成多个小库存,拆分后,一次扣减动作就可以分散到不同的库、表中进行,降低锁粒度提升并发。 优点:实现较简单 缺点:存在碎片问题、库存调控不方便 2、请求合并,云南idc服务商把多个库存扣减请求,合并成一个,进行批量更新。 优点:简单 缺点:适用于异步场景,或者经过分析后认为可以合并的场景 3、把update转换成insert,直接插入一次占用记录,然后异步统计剩余库存,或者通过SQL统计流水方式计算剩余库存。 优点:没有update,无锁冲突 缺点:insert时控制不好容易超卖、insert后剩余库存不好统计 企业级方案除了上面这三个方案外,重点介绍一个很多大公司在用的,扛了618/双11等大促的高并发的秒杀的方案。 那就是改造MySQL 主要思路就是,针对于频繁更新或秒杀类业务场景,大幅度优化对于热点行数据的update操作的性能。当开启热点更新自动探测时,系统会自动探测是否有单行的热点更新,如果有,则会让大量的并发 update 排队执行,云服务器以减少大量行锁造成的并发性能下降。(另外我出了一份Java面试宝典,类似的方案有很多) 也就是说,他们改造了MySQL数据库,让同一个热点行的更新语句,在执行层进行排队。这样的排队相比update的排队,要轻量级很多,因为他不需要自旋,不需要抢锁。 这个方案的好处就是开发不需要做额外的事情,只需要开启热点检测就行了。缺点就是改造MySQL数据库有成本。不过现在很多云上数据库都支持了。 效果如何?比如阿里云的数据库在做过改造之后,就做过单行热点数据更新测试。 本示例中,分别使用两个实例进行测试(高可用版和三节点企业版),规格码为rds.mysql.st.v52和mysql.st.12xlarge.25。 实例版本:MySQL 5.7实例规格:90核720GB(独占物理机型)实例系列:高可用版和三节点企业版实例存储类型:本地盘实例模板:高性能参数模板测试数据为单表,表内100行记录。表结构如下: 复制CREATE TABLE `sbtest1` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,`k` INT(10) UNSIGNED NOT NULL DEFAULT 0 ,`c` CHAR(120) NOT NULL DEFAULT ,`pad` CHAR(60) NOT NULL DEFAULT ,PRIMARY KEY (`id`) ,KEY `k_1` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 MAX_ROWS=10000001.2.3.4.5.6.7.8.9.10.11. 对id=100的源码下载记录进行并发更新,SQL如下: 复制UPDATE sbtest1 SET k=k+1 WHERE id=1001. 测试的Lua脚本如下: 复制pathtest = string.match(test,"(.*/)") if pathtest then dofile(pathtest .."common.lua") else require("common") end function thread_init(thread_id) set_vars() end function event(thread_id) local table_name table_name ="sbtest".. sb_rand_uniform(1, oltp_tables_count) rs = db_query("begin") rs = db_query("update /*+commit_on_success rollback_on_fail target_affect_row(1) */ sbtest1 SET k=k+1 WHERE id=100") rs =db_query("commit") end1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16. 测试结果实例类型 单行记录更新峰值(TPS) RDS高可用版 1.2万 RDS三节点企业版 3.1万 参考资料:腾讯云数据库MySQL热点更新: https://cloud.tencent.com/document/product/236/63239 阿里云数据库Inventory Hint: https://www.alibabacloud.com/help/zh/apsaradb-for-rds/latest/inventory-hint |