【问题标题】:MongoDB Covered QueriesMongoDB 涵盖的查询
【发布时间】:2015-06-09 07:10:42
【问题描述】:

我不确定我是否理解完全涵盖的查询概念。如果仅使用存储在索引中的信息可以回答它,我们就有一个覆盖查询。为了覆盖查询,通常使用投影。

如果我们的查询除了“查找”之外还进行了“排序”,那么“排序”部分需要被索引覆盖才能获得覆盖查询?

我想是的,但由于我在互联网上没有找到明确的答案,所以我更喜欢问。

谢谢你,阿内

【问题讨论】:

  • 欢迎使用 SO,如果您将尝试过的代码放在问题中,那会更有用。

标签: mongodb


【解决方案1】:

我也找不到明确的答案,但这是合乎逻辑的 - 如果您需要排序,则需要根据您的排序数据。如果这些数据没有存储在索引中,您需要从其他地方读取它们,然后您就没有覆盖查询,因为如果覆盖查询的关键是您不必查看除索引。

您可以使用explain() 进行检查。

【讨论】:

  • 很好解释。还想指出,如果您在涵盖的查询上运行 explain(),indexOnly 字段将为真。
【解决方案2】:

非常感谢,您的回答很有帮助。 我在本地集合中做了一些测试,确实排序部分需要被索引覆盖才能有一个被覆盖的查询。

示例: 1 .- 我在一个空集合中创建了一个索引:

db.myCollection.createIndex({x:1,y:1,z:1})

2 .- 我已插入数据

db.myCollection.insert({x:5})

3.- 我做了不同的查询并使用“解释”来查看查询是否被覆盖(indexOnly:true)

db.myCollection.find({x:5},{x:1,_id:0}) --> it is covered !
db.myCollection.find({x:5},{x:1,_id:0}).sort({x:1}) --> it is covered !
db.myCollection.find({x:5,y:4},{x:1,_id:0}).sort({x:-1,y:-1}) --> it is covered!


db.myCollection.find({x:5},{x:1,_id:0}).sort({z:1}) --> it is NOT covered !
db.myCollection.find({x:5},{x:1,_id:0}).sort({y:-1,x:-1}) --> it is NOT covered !

所以这个例子表明,“排序”会影响查询是覆盖查询这一事实

【讨论】:

  • docs say indexOnly 字段在最新版本的 MongoDB 中不可用。相反,我们必须检查我们有一个不是 FETCH 阶段的后代的 IXSCAN 阶段,并且 totalDocsExamined 为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2019-02-26
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多