对于范围查询与不同领域的MongoDB索引策略(mongodb index strategy for

2019-07-23 02:28发布

Almoust我所有的文件包括2场,开始时间戳和结束时间戳。 而在我的每一个查询我需要的元素是在时间范围内选定。 所以开始后,选择价值和最终应当选择前时间戳应该的。

查询看起来像

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

那么针对该方案的最佳索引策略?


顺便说一句,这是获得更好的性能 - 存储日期日期时间或UNIX时间戳,这是长期价值本身

Answer 1:

也更增添baloo的回答一点。

在时间戳与长期的问题。 一般来说MongoDB服务器不会看到差别。 所述BSON编码长度是相同的(64位)。 您可能会看到根据驾驶员的编码客户端的性能不同。 作为一个例子,在Java侧使用10gen的驱动时间标记呈现为Date比更重了很多Long 。 有司机试图避免的开销。

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

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

您查询将执行(可能很多)更好,如果你的查询是:

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

从概念上讲,如果你认为该指标为AA树的封闭范围内限制了树,而不只是一个侧面的两侧。 如果没有封闭的范围内,服务器必须“检查”的所有条目的一个start比提供的,因为它不知道之间的关系的时间戳更大的startfinal

你甚至可能会发现查询性能没有更好的使用单场指数,如:

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

大部分的储蓄从第一场的修剪。 其中,这将不会是这样的情况是当该查询是由索引或对结果的排序/排序覆盖可以从索引中导出。

HTH - 罗布。



Answer 2:

您可以使用复合索引 ,以创建多个字段的索引。

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

通过比较不同的查询和索引解释() ,以获得最出你的数据库



文章来源: mongodb index strategy for range query with different fields