【问题标题】:Index intersection issue in mongomongo中的索引交集问题
【发布时间】:2015-04-15 22:53:19
【问题描述】:

我使用的是 mongo 2.6.8 遇到以下问题:

集合users 具有索引_id_1b_1。当我执行查询时

db.users.find({"$and": [
     {"b": {"$gt": ISODate("somedate")}}, 
     {"b": {"$lt": ISODate("anotherdate")}},
     {"_id": {"$gt": "somevalue"}}, 
     {"_id": {"$lt": "anothervalue"}},
]})

我希望 mongo 将执行索引交集并使用相交索引,但它只选择 b_1 索引。在这个查询 allPlans 部分执行解释时,甚至不包含相交索引,只有 _id_1b_1

为什么mongo不进行索引交集?

【问题讨论】:

  • 收藏有多大?你有没有运行解释(真)?它是否表明考虑了索引交叉计划?
  • 集合大小为几 GB。当我写到allPlans 时,我的意思是解释是用true 标志执行的。正如我写的那样,我只看到了 mongo 尝试过的两个可能的计划:一个使用_id_1 索引,另一个使用b_1 索引。或许值得一提:我的 mongo 实例在集群中运行,并且有几个副本。

标签: mongodb


【解决方案1】:

我认为这可能是由于您在查询中对同一个索引键有两个限制(b 上的$gt$lt_id 也是如此))。如果您将查询更改为以下内容,您的解释会发生什么。如果它使用交叉点,我会是对的:

db.users.find({"$and": [
     {"b": {"$gt": ISODate("somedate")}}, 
     {"_id": {"$gt": "somevalue"}}, 
]})

在这种情况下,对一个索引使用两个限制可能比只对两个索引都使用一个限制并使用交集更快。

【讨论】:

  • 不幸的是,当每个字段有 1 个限制时,它不使用相交索引。仍然使用索引b_1 作为最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多