db.orders.createIndex({ user_id: 1, created_at: -1 });
db.orders.getIndexes();
db.orders.find({ user_id: 7 }).explain('executionStats');
按用户加时间范围查订单,explain 里 stage 是 COLLSCAN,totalDocsExamined 等于集合总条数。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:复合索引建成了时间在前用户在后的顺序,等值条件在前范围条件在后的规则没遵守,索引就只能闲着,扫描量自然下不来。
围绕「MongoDB 复合索引顺序」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:把等值字段放索引第一位,范围字段排在后面;先删掉重复的旧索引,再按新的字段顺序重建;用 explain 确认阶段从全表扫描变成索引扫描。
确认没问题再收工,explain 显示走索引,扫描文档数与返回条数基本持平。
