表上有联合索引 (tenant_id, status, create_time),查询只带 status 和 create_time,explain 里 key 为空,rows 78 万。日志里能对上时间点,这种反而好排。

联合索引按定义顺序逐列排序,第一列不参与条件时,后面两列在整棵树里是乱序的,没法用来定位。优化器只能整表扫,索引只剩下占空间的作用。这一点先确认清楚,后面就不用反复试。

ALTER TABLE orders ADD INDEX idx_status_time (status, create_time);
EXPLAIN SELECT id FROM orders
WHERE status = 1 AND create_time > '2026-03-01';

「最左前缀」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:把 tenant_id 补回 where 条件 多数业务查询本来就带租户;确实用不到第一列 就单独建 (status, create_time) 的索引;建完删掉被替代的旧索引 不要两张都留着;用 explain 确认 key 命中新索引 且 Extra 里没有 filesort。

结果对不对很好判断,explain 的 key 变成 idx_status_time rows 降到几千 排序也不再走 filesort。

作者 9823189