V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
diyazhu
V2EX  ›  数据库

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

  •  
  •   diyazhu · 2021-01-08 20:04:21 +08:00 · 1489 次点击
    这是一个创建于 1420 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天在线上遇到的问题遇到一个慢查询的问题:
    想要找到表 A 的某个字段的最大值,比如说 date 字段。原先写的查询语句如下:

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

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

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

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

    换一种写法,

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

    发现就走了索引。很奇怪!
    3 条回复    2021-01-11 10:09:01 +08:00
    snachx
        1
    snachx  
       2021-01-08 21:10:01 +08:00 via iPhone
    你这种情况就是不会用索引的,$group 在特定条件下才会用索引

    https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
       2021-01-09 00:34:09 +08:00 via iPhone
    感觉 id null 那步类似做了一次映射,映射的结果已经没有 index 了。
    diyazhu
        3
    diyazhu  
    OP
       2021-01-11 10:09:01 +08:00
    @snachx @JCZ2MkKb5S8ZX9pq 感谢大佬的回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3098 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:04 · PVG 19:04 · LAX 03:04 · JFK 06:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.