gpt4 book ai didi

performance - MongoDB 在计算空值时非常慢(或 {$exists : false})

转载 作者:IT老高 更新时间:2023-10-28 13:28:07 26 4
gpt4 key购买 nike

我有一个运行在具有 16GB 内存的 VPS 上的 Mongo 服务器(尽管使用磁盘的 IO 可能很慢)。

我收集了大约 3500 万条不适合主内存的记录(db.stats() 报告的 size 为 35GB, storageSize 为 14GB),但是为 totalIndexSize 报告的 1.7GB 应该很合适。

我正在查询的特定字段 bg 可以以值 true 存在或完全不存在(请不要讨论这是否是最佳数据表示 -我仍然认为 Mongo 的行为很奇怪)。该字段使用报告大小为 146MB 的非稀疏索引进行索引。

我正在使用带有默认缓存大小的 WiredTiger 存储引擎(因此它应该在 8GB 左右)。

我正在尝试计算缺少 bg 字段的记录数。

计数 true 值相当快(几秒钟):

> db.entities.find({bg: true}).count()
8300677

但是缺失值的查询非常慢(大约 5 分钟):

> db.entities.find({bg: null}).count()
27497706

在我看来,explain() 看起来不错:

> db.entities.find({bg: null}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "testdb.entities",
"indexFilterSet" : false,
"parsedQuery" : {
"bg" : {
"$eq" : null
}
},
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"bg" : {
"$eq" : null
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"bg" : 1
},
"indexName" : "bg_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"bg" : [
"[null, null]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "mongo01",
"port" : 27017,
"version" : "3.0.3",
"gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
},
"ok" : 1
}

但是,即使在重复调用之后,查询仍然很慢。其他不同值的计数查询很快:

> db.entities.find({bg: "foo"}).count()
0
> db.entities.find({}).count()
35798383

我觉得这种奇怪,因为我的理解是非稀疏索引中缺少的字段只是存储为null,所以带有null的count查询应该是类似于计算实际值(或者如果必须计算更多索引条目或其他东西,可能最多三倍于三倍的正值)。确实,this answer报告与涉及 null 值和 .count() 的类似查询相比,速度得到了极大的提高。我能想到的唯一区别点是 WiredTiger。

谁能解释为什么我的查询计算空值这么慢或者我可以做些什么来修复它(除了从总数中明显减去 true 计数,这会很好但不能满足我的好奇心)?

最佳答案

这是预期行为,请参阅:https://jira.mongodb.org/browse/SERVER-18653 .对我来说似乎是一个奇怪的电话,但你去吧,我敢肯定有比我更了解 MongoDB 的程序员负责。

您需要使用不同的值来表示 null。我想这将取决于您使用该字段的目的。在我的情况下,它是一个外部引用,所以我将开始使用 false 来表示 null。如果您使用它来存储 bool 值,那么您可能需要使用“null”、-1、0 等。

关于performance - MongoDB 在计算空值时非常慢(或 {$exists : false}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319805/

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