您的当前位置:首页 > 时尚 > 极客时间mysql45讲 正文

极客时间mysql45讲

时间:2026-10-17 04:33:02 来源:网络整理 编辑:时尚

核心提示

2018年,我在一个电商公司的订单库上踩了个坑。大促前压测,QPS刚到3000,数据库连接池就爆了。当时第一反应是加机器、加连接数,结果越加越慢。后来翻到《极客时间MySQL45讲》里林晓斌写的那篇关

2018年,极客l讲我在一个电商公司的时间订单库上踩了个坑。大促前压测,极客l讲QPS刚到3000,时间数据库连接池就爆了。极客l讲当时第一反应是时间加机器、加连接数,极客l讲结果越加越慢。时间后来翻到《极客时间MySQL45讲》里林晓斌写的极客l讲那篇关于连接池和线程调度的文章,才发现问题出在InnoDB的时间并发线程控制上——innodb_thread_concurrency参数默认是0,意味着不限制,极客l讲但操作系统调度器在高压下反而成了瓶颈。时间改完参数,极客l讲QPS直接拉到1.2万。时间这事让我意识到,极客l讲很多MySQL问题不是靠堆资源能解决的,得理解它内部怎么运转。

林晓斌这个专栏最值钱的地方,是他把MySQL拆成了一个个可验证的模块。比如讲索引,他不光说B+树,还让你用ALTER TABLE加索引时观察INFORMATION_SCHEMA.INNODB_SYS_INDEXES里的页分裂情况。我照着做了一次,在10万行表上建二级索引,发现PAGE_NO从3跳到7,中间空出来的页就是分裂留下的碎片。这种细节,官方文档不会告诉你,但线上慢查询往往就藏在这些地方。

另一个让我反复回看的是事务隔离级别那几讲。之前我一直以为RR(可重复读)就是靠MVCC快照读,直到看到他用SELECT ... FOR UPDATE演示当前读和间隙锁的配合。有次我们做库存扣减,两个事务并发更新同一行,一个先UPDATE再SELECT,另一个直接SELECT ... FOR UPDATE,结果后者被阻塞了3秒。查SHOW ENGINE INNODB STATUS才看到间隙锁锁住了相邻区间。林晓斌在专栏里画的那张锁范围示意图,比任何博客都清楚——他标出了supremum伪记录的位置,以及插入意向锁什么时候会冲突。

专栏里讲主从复制的那部分,我拿来做了一次线上演练。用SHOW SLAVE STATUS看Seconds_Behind_Master,发现它偶尔跳到0又跳到200。按文章里的思路,去查relay_log的GTID执行情况,最后定位到是大事务在从库上串行回放导致的。后来我们把一个大DELETE拆成每批500行,延迟从分钟级降到秒级。这种实操经验,比单纯讲binlog格式有价值得多。

当然,45讲不是银弹。有些章节偏理论,比如讲join算法时,BNL和BKA的对比在MySQL 8.0之后已经变了,hash join的引入让部分结论需要更新。但林晓斌在评论区的回复很及时,有人问8.0的hash join,他直接贴了执行计划对比图。这种互动感,比读一本静态的书强。

我现在的习惯是,每次遇到慢查询,先EXPLAIN看type和rows,再去专栏里翻对应的优化章节。有次一个ORDER BY加LIMIT的查询走了全表扫描,按文章里“排序算法”那节的思路,把sort_buffer_size从256K调到2M,Using filesort变成了Using index。这种即时反馈,是技术专栏最实在的地方。

如果你刚接触MySQL,别指望看完45讲就能调优。但如果你已经在写SQL、建索引、处理死锁,这个专栏能帮你把零散的知识点串成一条线——从redo log的刷盘策略到undo log的清理时机,从change buffer的合并到buffer pool的LRU改进。它不教你背参数,而是让你理解每个参数背后的权衡。这大概就是极客时间做技术专栏的初衷:把复杂系统拆开,让你看到齿轮怎么咬合。