gpt4 book ai didi

mongodb - 为什么这个简单的 MongoDB 查询有这么多的 nYield?

转载 作者:可可西里 更新时间:2023-11-01 10:04:07 25 4
gpt4 key购买 nike

我有一个具有以下索引的测试数据库:

[
{
"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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com