在2016年底发布了MySQL 5.7的GA版本,但大部分公司线上用的还是5.6的版本。Facebook的MyRocks也是基于5.6进行开发,MyRocks未来会直接合并到8.0。
本文的分享是基于MySQL 5.6.19和Percona 5.6.25来进行的。我们对这两个版本,进行了MySQL源码的修改,从Facebook 5.6开源版本里面抽取了关闭死锁检测的补丁,合并到了MySQL 5.6.19和Percona 5.6.25,并进行了性能压测。
OK,切入本文的主题,MySQL的热点更新场景,对应到业务场景是秒杀系统,热点商品减库存。
在性能压测计划中,主要进行了四个版本的对比:
MySQL 5.6.19原生版本
MySQL 5.6.19增加死锁检测关闭(5.6.1.9 no deadlock check ndlc)
Percona 5.6.25原生版本(percona tp)
Percona 5.6.25增加死锁检测关闭(percona tp nldc)
对这四个版本进行了8、16、32、64、128、512、1024、2048、4096个并发线程的压测。
压测工具 sysbench0.5。
事务隔离级别均为READ-COMMITTED,CPU 32cores,BP15G。数据放在SSD,日志放在SAS盘。
表结构和数据准备:由于秒杀和减库存重要的瓶颈之一是在update语句的效率,我们为了简单理解起见,用一个最核心的update语句来做事务。
#创建测试表 CREATE TABLE `test_update` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stock` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 insert into item.test_update (id,stock) value(1,500000); #更新语句 update test_update set stock =stock -1 where id = 1 and stock |