gpt4 book ai didi

即使在索引字段上,mongodb $all 和 $in 也非常慢

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

我有大约 8000 万个文档的集合,每个文档在 tags 字段中存储一组标签,例如:

{text: "blah blah blah...", tags: ["car", "auto", "automobile"]}

tags 字段已编入索引,因此这样的查询自然几乎是即时的:

 db.documents.find({tags:"car"})

但是以下查询都很慢,需要几分钟才能完成:

 db.documents.find({tags:{$all:["car","phone"]}})
db.documents.find({tags:{$in:["car","auto"]}})

即使数组只有一项,问题仍然存在:

 db.documents.find({tags:{$all:["car"]}})  //very slow too

我认为 $all 和 $in 应该能够非常快地工作,因为 tags 已编入索引,但显然情况并非如此。为什么?

最佳答案

事实证明这是 MongoDB 中的一个已知错误,截至 2.2 尚未修复

MongoDB在使用$all搜索多个条目时执行索引交集。仅使用索引查找数组中的第一项,并扫描所有匹配的文档以过滤结果。

例如,在查询 db.documents.find({tags:{$all:["car","phone"]}}) 中所有包含标签“car”的文档都需要被检索和扫描。由于有问题的集合包含超过十万个带有“汽车”标签的文档,因此速度下降并不令人意外。

更糟糕的是,MongoDB 甚至没有执行简单的优化,即选择 $all 数组中代表最少的项目进行索引查找。如果有 100000 个标记为“car”的文档和 10 个标记为“phone”的文档,MongoDB 仍然需要扫描 100000 个文档以返回 {$all:["car", "phone"]} 的结果

另请参阅:https://jira.mongodb.org/browse/SERVER-1000

关于即使在索引字段上,mongodb $all 和 $in 也非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760879/

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