缓存和数据库不一致的问题,讨论了两天最后决定用延迟双删。我把手上的资料翻出来又读了两遍。我把这个子查询改成了关联查询,优化器终于算对了。感动,然后我学到了新的一课

我把这个查询拆成了两步,反而比原来更快。我拉了个小群,把相关同学都叫了进来。我把这个索引建成了覆盖索引,回表彻底消失了。好在最后有惊无险

数据库的每一次变更都值得多问一句「能不能回滚」。我笑了笑,决定不解释。我把执行计划贴出来逐行分析,最后发现是隐式转换让索引失效了

分库分表方案讨论了一周,最后数据量根本没到那个级别。我把整条链路在心里复盘了一遍。我打开了这张表的碎片率,决定重建一次。这条经验值直接拉满

索引不是越多越好,我是在加了第七个之后明白的。我把它记在心里,没跟任何人说。我把这个锁的粒度从表级降到了行级,并发立刻上来了。果然现实比段子更精彩

我把这条 SQL 交给优化器,它有自己的想法。我决定先把手上的事情做完再处理这件事。我把这个锁的粒度从表级降到了行级,并发立刻上来了。连茶水间都安静了

我把这个查询拆成了两步,反而比原来更快。我先确认了一遍前置条件,再动手。我打开了这张表的统计信息,发现已经一个月没更新。好在最后有惊无险

我把这个业务的唯一约束想清楚了,然后发现拦住了自己。我先给自己泡了杯茶,做好了打持久战的准备。我把这个 join 的顺序调整了一下,临时表不再落盘。我沉默了,但心里是服的

我把这条数据链路理了一遍,发现有个环节没人负责。我默默打开了编辑器,准备一步步验证。我把这个配置的读写分离开关打开了,主库压力立刻下来了。世界瞬间清净了

数据库字段名叫 is_del,注释叫"是否删除",实际含义是"是否没删除"。我抬起头看了看周围,大家都一样。我打开了这个慢查询的采样,发现集中在两个接口上。我把这条经验写进了团队 wiki