gpt4 book ai didi

MongoDB对索引字段的查询非常慢

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

我有一个包含大量文档的集合 (32 809 900)。所有文档都有一个名为 soft_deleted 的字段。我还创建了 soft_deleted: 1 字段。然后我测试了一些与该领域相关的不同查询。这是我的结果:

Query                                Number of results  Time in milliseconds
db.cgm_egvs
.find().count() 32809900 90
db.cgm_egvs
.find({soft_deleted: true}) 2820897 688
.count()
db.cgm_egvs
.find({soft_deleted: false}) 29989003 3983
.count()
db.cgm_egvs
.find({soft_deleted: null}) 0 42
.count()
db.cgm_egvs
.find({soft_deleted: {$ne: true}}) 29989003 82397
.count()

为什么这些查询之间的查询时间如此不同?我希望找到 soft_deletedtruefalse 的文档需要相同的时间。更重要的是,为什么通过 != true 进行查询比任何其他查询都慢这么多?

最佳答案

soft_deleted 字段的基数很低;它只有两个不同的值 true 和 false,因此在此字段上建立索引不会有太多好处。通常索引在具有高基数的字段上表现更好。

在 {soft_deleted: true} 查询的情况下,soft_deleted: true 的行数与 {soft_deleted: false} 相比要少得多,mongodb 必须扫描的索引条目数要少得多。因此 {soft_deleted: true} 查询花费的时间更少。

同样,查询 {soft_deleted: null} 花费的时间更少,因为索引只有 2 个不同的值,在这种情况下,需要的扫描也少得多。

您的最终查询使用 $ne 运算符,而 $ne 运算符没有选择性(选择性是查询使用索引缩小结果范围的能力)。 https://docs.mongodb.com/v3.0/faq/indexes/#using-ne-and-nin-in-a-query-is-slow-why .所以执行起来需要更多的时间。

关于MongoDB对索引字段的查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37051068/

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