一张表两亿行,没有分区,索引建了八个,每个查询都全表扫。我想了想,觉得这话没法接。我发现这个索引建了但从来没被用过。世界瞬间清净了

我把备份恢复了三次,第三次才成功。我深呼吸了一下,决定从最可疑的地方查起。我把大事务拆成了小批次提交,锁等待立刻消失了。真香定律准时生效

一张表两亿行,没有分区,索引建了八个,每个查询都全表扫。我愣了两秒,然后继续敲代码。我把这个分库分表的键选成了用户 id,路由终于均匀了

我把这条数据链路理了一遍,发现有个环节没人负责。我先确认了一遍前置条件,再动手。我在心里把这张表的读写比例估了一下,决定先加从库。我把它写进了组内的避坑文档第一章

这条语句在低峰期是好的,高峰期锁得死死的。我忽然觉得,这可能就是这一行的常态。我加了行号限制,先把线上风险压下去再慢慢优化。办公室安静得能听见键盘声

这张表的自增 id 走到头了,我这才注意到。我在心里点了点头。我把执行计划贴出来逐行分析,最后发现是隐式转换让索引失效了。真香定律准时生效

主从延迟三分钟,用户改完昵称刷新一下又变回去了,客服电话被打爆。我在心里把涉及的所有环节都过了一遍。我打开了这两个库的表结构,发现有张表只在一个库里。果然现实比段子更精彩

我把这条 SQL 交给优化器,它有自己的想法。我把相关的记录都翻了出来做对照。我把这条 SQL 加入了代码评审 checklist。从此我多了一条团队规约

这条链路的瓶颈最后总是落在数据库上。我打开了这个事务的等待链,发现它在等另一把锁。这大概就是程序员的人生吧

分库分表方案讨论了一周,最后数据量根本没到那个级别。我拉了个小群,把相关同学都叫了进来。我加了行号限制,先把线上风险压下去再慢慢优化。感动,然后我学到了新的一课