MongoDB聚合按Data.ReceivedAt排序未走索引问题解决方案咨询
根因说明
你遇到的索引未命中问题是由MongoDB复合索引的最左前缀匹配规则导致的:
现有复合索引Data.Sku_1_Data.ReceivedAt_-1的第一排序键为Data.Sku,只有查询或排序条件包含该前缀键时,索引中后续的Data.ReceivedAt字段才能被索引覆盖。你第二个查询直接按Data.ReceivedAt字段排序,未匹配到索引前缀规则,只能执行全表扫描和内存排序,数据量较大时自然会出现数分钟的超长耗时。
解决办法
你给出的新建Data.ReceivedAt单列索引创建语句完全适用,执行该语句后,针对Data.ReceivedAt的排序操作即可命中索引,查询耗时会大幅下降:
db.eventlogs.createIndex( { "Data.ReceivedAt": -1 }, { "background": true });
操作建议
- 建索引时指定
background: true会后台异步构建索引,不会阻塞线上业务的正常读写,建议选择业务低峰期执行该操作。 - 索引生效后,聚合语句中的
allowDiskUse: true配置可以移除,排序操作会直接在索引层完成,不会触发磁盘排序。
内容的提问来源于stack exchange,提问作者Mustafa Hamit
相关产品推荐
相关产品推荐

