作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个具有以下索引的测试数据库:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "blogger.users"
},
{
"v" : 1,
"key" : {
"name" : 1,
"age" : 1
},
"name" : "name_1_age_1",
"ns" : "blogger.users"
},
{
"v" : 1,
"key" : {
"age" : 1,
"name" : 1
},
"name" : "age_1_name_1",
"ns" : "blogger.users"
}
]
运行以下查询时:
> db.users.find({"age":{"$gte":21,"$lte":30}})
.sort({"name":1})
.hint({"name":1,"age":1})
.explain()
我得到以下结果
{
"cursor" : "BtreeCursor name_1_age_1",
"isMultiKey" : false,
"n" : 83116,
"nscannedObjects" : 1000000,
"nscanned" : 1000000,
"nscannedObjectsAllPlans" : 1000000,
"nscannedAllPlans" : 1000000,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 7812,
"nChunkSkips" : 0,
"millis" : 1926,
"indexBounds" : {
"name" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
],
"age" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
"server" : "Johny-PC:27017",
"filterSet" : false
}
我多次运行此查询,nYields 始终高于 7k。没有任何其他进程更新、插入或删除数据。当我在没有提示的情况下运行相同的查询时,结果是相同的。
如果我使用其他索引作为提示运行相同的查询,则 nYields 为 1200+。
在没有提示和排序的情况下,速度很快,但使用 nYields:500+ 并按预期使用了另一个索引。
那么有没有办法找出为什么会有这么多 nYield,有人可以解释为什么会这样吗?
编辑: 一个简单的查找查询也有那么多 nYield。所以,问题不在于索引。我可能遗漏了什么。
最佳答案
您通过 hint
调用强制查询使用错误的索引,因为查询需要先按 age
过滤,然后按 name 排序
。您告诉 MongoDB 使用的索引不能有效地用于此目的。
删除 hint
调用或将其更改为:
db.users.find({"age":{"$gte":21,"$lte":30}})
.sort({"name":1})
.hint("age_1_name_1")
.explain()
查询需要扫描的文档越多 (nscannedObjects
),它在等待 I/O 完成以获取文档时产生读锁的次数就越多。所以查询效率越低,nYields 就越高。 500+ yield 没有任何问题,它只是意味着它是一个返回大量文档的查询(在本例中为 83k)。
关于mongodb - 为什么这个简单的 MongoDB 查询有这么多的 nYield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25615455/
我有一个具有以下索引的测试数据库: [ { "v" : 1, "key" : { "_id" : 1
我是一名优秀的程序员,十分优秀!