如果
上有索引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_id
和date
,仍然可以使用索引。
但是,省略page_type
时,不能使用索引(如explain()
所示)。因此,在MongoDB中,当索引的一部分是序列(如数字或日期)时,查询时可以省略它吗?在关系数据库中也是如此,因为我认为如果该索引基于这3个字段,它可能严格地在3个字段上。
答案 0 :(得分:1)
这些是B树索引,因此它们可用于所涉及列的前缀子集。如果您没有前导列,则不再可以进行索引范围扫描(主要用于B树索引的操作)。可能还有其他方法仍然使用索引(例如,Oracle具有快速完全扫描和跳过扫描),但通常不会使用索引。
这种推理适用于使用B树索引的所有内容,无论是否使用关系数据库。
同样,这不依赖于列的类型,而是依赖于索引中列的顺序。您需要具有前导列(在您的情况下,您需要page_type)。如果您有许多没有page_type的查询,请考虑使用page_type作为最后一列重新创建索引(这当然也可能对其他查询产生负面影响)。通常,您需要知道在设计索引之前将运行哪种查询。