2

如果有索引

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 个字段上。

4

1 回答 1

1

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

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

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

于 2010-09-21T05:45:17.780 回答