我的收藏品有10M文件,并有一个名为movieId的字段;该文件具有以下结构:
{
"_id" : ObjectId("589bed43e3d78e89bfd9b779"),
"userId" : 1,
"movieId" : 122,
"rating" : 5,
"timestamp" : 838985046,
"newId" : 0.0
}
db.collection.createIndex({movieId:1});
我正在运行以下查询(VarSize只是一个变量):
db.collection.aggregate(
[{
$match:{"movieId":{$lte:VarSize}}
}]);`
我正在比较这个查询性能,但是当VarSize
很小时,使用索引查询集合的速度更快(1-2秒),而在没有索引的情况下查询集合则需要14秒。但是当VarSize
很大,超过1000时,查询索引集合的速度比未编制索引的集合慢;查询索引集合的时间要长两倍。
更新#1:
更新#2:
" toArray"当VarSize变得越来越大时,帮助我获得了越来越多的价值。没有它我认为返回值只是一个游标。
答案 0 :(得分:0)
我认为应该非常直接。首先,它不是一个覆盖的查询,否则你将获得更好的性能。索引的coll。在这里,您选择的是具有电影ID和_id的完整文档。 坚持基础知识我将尝试解释DB中可能发生的事情 - 考虑db中只有10个文档,电影ID是连续值(即使它们不是那么它也可以,但我只是为了理解目的而考虑顺序)
注意 - 在案例2中,我采用varSize = 9只是为了更好地解释问题。我想如果varSize = maxMovieId那么即使在索引集合中它也不会使用索引。但是如果varSize有点达到70或80%的值,那么它将尝试使用索引思维它会更快但最终会耗费更多时间。 同样,查询规划器最终会认识到varSize面向maxMovieId的查询需要更多时间,因此即使对于索引集合也不会使用索引。但是,当查询计划程序在后台运行查询并在后台检查时间内部的各种计划时,我们无法判断它何时会发生。
总结,索引工作"不是很直接"当你做范围查询。也许这就是为什么他们有equality-sort-range rule。
编辑:我说得对,这是我的测试结果 -我现在不了解您的图表,我认为这是错误的,或者您无法清楚地解释它或图表中缺少某些信息。使用10M文档时,橙色线不会花费更少的时间。你能否澄清一下varSize的考虑因素,因为当我们进行范围查询时,范围值很重要。