冻结库存,性能翻8倍的背后原理

冻结库存,性能翻8倍的背后原理

#技术 #mysql

背景如下

双十一压测,库存服务冻结场景性能 不忍直视,QPS 令人汗颜,相比于其他的接口性能,差的不止一点半点。 sql如下

sql 复制代码
update stockset frozen_num = frozen_num + #{num}where  stock_num - frozen_num  - #{num}> 0and id = #{id}

单数据,循环去压
最终是由DBA从db 的层面,去解决了这个问题。
当时业务侧,通过代码进行压测,单条性能只能达到1000+ 一点 但是dba 单压sql ,能达到1.2 w左右的QPS,这样的情况。

如何会有这么大的一个差别。

解决思路

通过以上的一个表现,去进行了一些思考。

  • 业务侧的路由算法导致

路由一般都是很简单的基本算法,不会有太大的性能损耗,且是倍数的处理。

  • 事务问题导致: 的确,带事务比不带事务,性能要高不少,但是也是有限,依旧达不到DBA的压测水准。
  • 业务侧 + db 侧 两方面处理 目前DB 版本为 mysql 5.7.x 最后调整了这2个参数

这2个基于mysql 5.7 新增的参数设置,通过设置该值,压测性能 也能到达了 8000

但是,究竟原理是为什么呢?

1.: ** binlog_group_commit_sync_delay

全局动态变量,单位微妙,默认0,范围:0~1000000(1秒)。 表示binlog提交后等待延迟多少时间再同步到磁盘,默认0,不延迟。设置延迟可以让多个事务在用一时刻提交,提高binlog组提交的并发数和效率,提高slave的吞吐量。 2: binlog_group_commit_sync_no_delay_count

全局动态变量,单位个数,默认0,范围:0~1000000。

表示等待延迟提交的最大事务数,如果上面参数的时间没到,但事务数到了,则直接同步到磁盘。若 binlog_group_commit_sync_delay 没有开启,则该参数也不会开启。

思考

如果问题发生,如何进行思考?

  1. 表象是这个表象,要通过表象查看事物底层原因问题
  2. 技术底层知识,必不可少,比如 io,mysql底层,往往一些常规的措施,已经知道的,大家都已经知道了,而真正卓越优秀突出的,就在在往前的那么一丁点上。
  3. 多扩展自己的知识面,触类旁通,这样有更高的眼界和思维,更多方面的思考。
  4. 一个人,难以想明白,集合大家的思路,一起进行脑暴
相关推荐
计算机毕设定制辅导-无忧学长2 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
新*17 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
这个DBA有点耶18 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风18 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
疯华整猫1 天前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
杨凯凡1 天前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Decay__1 天前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
瑞雪兆丰年兮1 天前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
FungLeo1 天前
成为全栈·基础补充·数据库迁移与事务:数据结构怎样安全演进
mysql·postgresql·sqlite·数据一致性·数据库事务·数据库迁移·成为全栈
aiks_yuan2 天前
MySQL GROUP BY 很慢怎么优化:加了索引反而从 1 秒变 7 秒,Using temporary 该不该消(MySQL 8.2 实测 400 万行)
mysql