Almoust我所有的文件包括2场,开始时间戳和结束时间戳。 而在我的每一个查询我需要的元素是在时间范围内选定。 所以开始后,选择价值和最终应当选择前时间戳应该的。
查询看起来像
db.collection.find({start:{$gt:DateTime(...)}, final:{$lt:DateTime(...)}})
那么针对该方案的最佳索引策略?
顺便说一句,这是获得更好的性能 - 存储日期日期时间或UNIX时间戳,这是长期价值本身
Almoust我所有的文件包括2场,开始时间戳和结束时间戳。 而在我的每一个查询我需要的元素是在时间范围内选定。 所以开始后,选择价值和最终应当选择前时间戳应该的。
查询看起来像
db.collection.find({start:{$gt:DateTime(...)}, final:{$lt:DateTime(...)}})
那么针对该方案的最佳索引策略?
顺便说一句,这是获得更好的性能 - 存储日期日期时间或UNIX时间戳,这是长期价值本身
也更增添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
比提供的,因为它不知道之间的关系的时间戳更大的start
和final
。
你甚至可能会发现查询性能没有更好的使用单场指数,如:
db.collection.ensureIndex({start: 1})
大部分的储蓄从第一场的修剪。 其中,这将不会是这样的情况是当该查询是由索引或对结果的排序/排序覆盖可以从索引中导出。
HTH - 罗布。
您可以使用复合索引 ,以创建多个字段的索引。
db.collection.ensureIndex({start: 1, final: 1})
通过比较不同的查询和索引解释() ,以获得最出你的数据库