【问题标题】:In MongoDB, if an index is on 3 fields, we can use that index when querying on 2 fields? (wildcard on the 3rd field)在 MongoDB 中,如果索引在 3 个字段上,我们可以在查询 2 个字段时使用该索引吗? (第三场通配符)
【发布时间】:2010-09-21 01:37:26
【问题描述】:

如果有索引

page_type, our_id, date

查询时,

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}})

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}}).explain()

如果省略了our_id,或者省略了date,它仍然可以使用索引,在explain() 输出中会出现如下内容:

"our_id" : [
    [
        {
            "$minElement" : 1
        },
        {
            "$maxElement" : 1
        }
    ]
],

即使our_iddate都被省略,索引仍然可以使用。

但是,当page_type被省略时,不能使用索引(如explain()所示)。那么在 MongoDB 中,当索引的一部分是序列的东西,比如数字或日期时,是否真的可以在查询时省略它?这在关系数据库中也是如此吗,因为我认为如果该索引基于这 3 个字段,它可能会严格基于 3 个字段。

【问题讨论】:

    标签: mongodb indexing mongoid


    【解决方案1】:

    这些是 B 树索引,因此它们可用于相关列的前缀子集。如果您没有前导列,则不再可能进行索引范围扫描(B 树索引主要用于的操作)。可能还有其他方法仍然可以使用索引(例如 Oracle 有快速的全扫描和跳过扫描),但通常不会使用索引。

    这种推理适用于所有使用 B-tree 索引的事物,无论是否使用关系数据库。

    同样,这不取决于列的类型,而是取决于索引中列的顺序。您需要有前导列(在您的情况下,您需要 page_type)。如果您有许多没有 page_type 的查询,请考虑重新创建以 page_type 作为最后一列的索引(这当然也可能对其他查询产生负面影响)。一般来说,在设计索引之前,您需要知道要运行哪种查询。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 2021-09-15
      • 2020-10-11
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多