分享一次线上慢 SQL 的排查过程,不算复杂,但挺典型。
起因是业务反馈某个接口偶尔要好几秒。先在 OCP 的 SQL 诊断里按耗时排序,锁定了一条 SQL。
拿到 SQL 一看,where 条件里有个字段没走索引,但是线上数据分布不均匀,某些值命中特别多,优化器算出来走全表可能更划算,就真全表扫了。
试了几个办法:一是补了个更合适的复合索引;二是把那条 SQL 的写法改了一下,避免隐式转换;三是对统计信息重新收集了一下。改完之后基本稳定在毫秒级。
经验就是:慢 SQL 别急着加索引,先看执行计划,很多时候是数据分布或者统计信息的锅。