待审核列表翻到第 200 页要 18 秒,数据库 CPU 打到 85%,前端一直转圈最后超时,第一页却很快。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

ALTER TABLE audit_task ADD INDEX idx_status_created (status, created_at);
EXPLAIN SELECT id FROM audit_task WHERE status=0 ORDER BY created_at LIMIT 20;

查询按状态加时间排序,这两个字段没有联合索引,每次都要全表扫描再排序。翻页用大 offset,越往后越慢。这一点先确认清楚,后面就不用反复试。

「审核列表慢查询」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,建状态和时间的联合索引,顺序按查询条件排;分页改成基于游标,用上一页最后一条的 id 做条件;观察慢查询日志,确认扫描行数降下来。

改完照着核一遍,第 200 页打开时间降到 1 秒内,EXPLAIN 里 type 不再是 ALL。

作者 9823189