×

文章
2024.09.27

一条慢 SQL 把排盘接口打穿了

1 分钟读完 5435 次阅读 Mysql MySQL 慢查询 索引

上周四晚上接口超时扎堆。机器 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,在数据量跨过某个点之后突然咬人。