Mongo 聚合时的$max 操作为什么没有走索引?

2021-01-08 20:04:21 +08:00
 diyazhu
今天在线上遇到的问题遇到一个慢查询的问题:
想要找到表 A 的某个字段的最大值,比如说 date 字段。原先写的查询语句如下:

db.A.aggregate({$group:{_id:null, max_date:{$max:"$date"}}})

这在只有十万数据量级的时候返回非常快,可是目前已经有百万量级的,线上查询就变得很慢。
explain 后发现居然是全表扫描。

索引是肯定建了的。但建的是复合索引,date 字段是最左边的字段。

请教各位大佬,上面这个查询为什么没有走索引呢?

换一种写法,

db.A.find().sort({date:-1}).limit(1)

发现就走了索引。很奇怪!
1350 次点击
所在节点    数据库
3 条回复
snachx
2021-01-08 21:10:01 +08:00
你这种情况就是不会用索引的,$group 在特定条件下才会用索引

https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes
JCZ2MkKb5S8ZX9pq
2021-01-09 00:34:09 +08:00
感觉 id null 那步类似做了一次映射,映射的结果已经没有 index 了。
diyazhu
2021-01-11 10:09:01 +08:00
@snachx @JCZ2MkKb5S8ZX9pq 感谢大佬的回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743150

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX