gpt4 book ai didi

不同字段范围查询的mongodb索引策略

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

我几乎所有的文档都包含 2 个字段,start 时间戳和 final 时间戳。在每个查询中,我需要检索选定时间段内的元素。所以 start 应该在选定的值之后,final 应该在选定的时间戳之前。

查询看起来像

db.collection.find({start:{$gt:DateTime(...)}, final:{$lt:DateTime(...)}})

那么对于这种情况,最好的索引策略是什么?


顺便说一句,这对性能更好 - 将日期存储为日期时间或 unix 时间戳,这本身就是长值

最佳答案

baloo 添加更多内容的answer .

关于时间戳与长问题。通常 MongoDB 服务器不会看到差异。 BSON 编码长度相同(64 位)。根据驱动程序的编码,您可能会在客户端看到不同的性能。例如,在使用 10gen 驱动程序的 Java 端,时间戳呈现为比 Long 重得多的 Date。有drivers尽量避免这种开销。

另一个问题是,如果您关闭索引第一个字段的范围,您将看到性能提升。所以如果你使用 baloo 建议的索引:

db.collection.ensureIndex({start: 1, final: 1})

如果满足以下条件,查询将执行(可能)更好:

db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
final:{$lt:DateTime(...)}})

从概念上讲,如果您将索引视为一棵树,则封闭范围会限制树的两侧,而不仅仅是一侧。如果没有封闭范围,服务器必须“检查”所有 start 大于提供的时间戳的条目,因为它不知道 start最终

您甚至可能会发现使用单个字段索引的查询性能并没有更好,例如:

db.collection.ensureIndex({start: 1})

大部分节省来自第一个字段的修剪。不会出现这种情况的情况是查询被索引覆盖,或者结果的排序/排序可以从索引中得出。

关于不同字段范围查询的mongodb索引策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15601933/

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