diyazhu
V2EX  ›  数据库

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

  •  
  •   diyazhu · Jan 8, 2021 · 2175 views
    This topic created in 1975 days ago, the information mentioned may be changed or developed.
    今天在线上遇到的问题遇到一个慢查询的问题:
    想要找到表 A 的某个字段的最大值,比如说 date 字段。原先写的查询语句如下:

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

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

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

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

    换一种写法,

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

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

    https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
       Jan 9, 2021 via iPhone
    感觉 id null 那步类似做了一次映射,映射的结果已经没有 index 了。
    diyazhu
        3
    diyazhu  
    OP
       Jan 11, 2021
    @snachx @JCZ2MkKb5S8ZX9pq 感谢大佬的回复
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2895 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:02 · PVG 13:02 · LAX 22:02 · JFK 01:02
    ♥ Do have faith in what you're doing.