在MongoDB中,如果索引在3个字段上,我们可以在查询2个字段时使用该索引吗? (第3场的通配符)

时间:2010-09-21 01:37:27

标签: mongodb indexing mongoid

如果

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

1 个答案:

答案 0 :(得分:1)

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

这种推理适用于使用B树索引的所有内容,无论是否使用关系数据库。

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