我把备份恢复了三次,第三次才成功。我在心里把涉及的所有环节都过了一遍。我打开了这张表的统计信息,发现已经一个月没更新

这条链路的瓶颈最后总是落在数据库上。我盯着屏幕,觉得这才是我的一天。我把这个字段加了前缀索引,存储空间省了一大截。复盘会上我们把它列成了案例

这张表的自增 id 走到头了,我这才注意到。我停了一下,然后继续手上的活。我把这个查询改成了走主键,问题迎刃而解

发现一条线上 SQL 在事务里做了全表更新,我的手开始抖。我打开记录从头到尾扫了一遍。我把这个锁的粒度从表级降到了行级,并发立刻上来了。第二天这个方案就变成了团队标准做法

我把这个业务的唯一约束想清楚了,然后发现拦住了自己。我深呼吸了一下,决定从最可疑的地方查起。我打开了这张表的碎片率,决定重建一次。那一刻我觉得自己还是很专业的

我把这条数据链路理了一遍,发现有个环节没人负责。我重新看了一遍手上的计划,把风险项标了出来。我打开了这个慢查询的采样,发现集中在两个接口上。第二天这个方案就变成了团队标准做法

我把这个字段的类型定得太随意,三年后要还债。我在心里把涉及的所有环节都过了一遍。我在心里把这条链路的耗时拆成了四段,最慢的在意料之外。办公室安静得能听见键盘声

数据库的悲观和乐观,最后都变成了加班。我愣了两秒,然后继续敲代码。我把慢查询日志按耗时排序,第一名比我预想的还慢十倍。好在最后有惊无险

这个字段的区分度很低,建索引的意义不大。我把它记在心里,没跟任何人说。我打开了这张表的碎片率,决定重建一次。世界瞬间清净了

缓存和数据库不一致的问题,讨论了两天最后决定用延迟双删。我重新看了一遍手上的计划,把风险项标了出来。我打开了这两个库的表结构,发现有张表只在一个库里。我把这条经验写进了团队 wiki