一条慢 SQL 把排盘接口打穿了
上周四晚上接口超时扎堆。机器 CPU 不高,MySQL 的 Threads_running 往上爬。不是流量突然翻倍,是一条查询在扫历史盘。
怎么定位
先打开慢日志,阈值临时调到 200ms。出现最多的是按 uid 加日期范围查,WHERE 里对日期做了 FROM_UNIXTIME(ctime)。函数包住列,索引直接废了。
SELECT id, title FROM zf_article
WHERE uid = 82 AND FROM_UNIXTIME(ctime) >= '2026-07-01'
ORDER BY ctime DESC LIMIT 20;
改法
把范围换成时间戳比较,走 (uid, is_del, ctime)。同样的页,从 1.8s 掉到 3ms 出头。
WHERE uid = 82 AND is_del = 0 AND ctime >= 1751299200
ORDER BY ctime DESC LIMIT 20;
EXPLAIN 里 type 要能到 ref,Extra 尽量不要 Using filesort。filesort 不一定是错,但和 LIMIT 20 放一起还出现,多半是排序列没进索引。
习惯
- WHERE 里不对索引列套函数。
- 分页不要
OFFSET 10000,用上一页最后一条 ctime/id 往下走。 - 慢日志常开,别等报警才想起。
这次不是配置问题。就是一句图省事的 SQL,在数据量跨过某个点之后突然咬人。