mongodb:limit()会提高查询速度吗?
是否mongodb:limit()会提高查询速度吗?,mongodb,Mongodb,是否db.inventory.find().limit(10)快于db.inventory.find() 我在mongodb中有数百万条记录,我希望在某些订单中获得前10条记录。使用limit()通知服务器,您将检索不超过k个文档。允许进行一些优化以减少带宽消耗并加快排序。最后,使用limit子句,服务器将能够更好地使用在RAM中排序时可用的32MB最大值(即:当无法从索引中获得排序顺序时) 现在,说来话长:find()返回一个游标。默认情况下,光标将批量将结果传输到客户端。从,: 对于大多数
db.inventory.find().limit(10)
快于db.inventory.find()
我在mongodb中有数百万条记录,我希望在某些订单中获得前10条记录。使用limit()
通知服务器,您将检索不超过k个文档。允许进行一些优化以减少带宽消耗并加快排序。最后,使用limit子句,服务器将能够更好地使用在RAM中排序时可用的32MB最大值(即:当无法从索引中获得排序顺序时)
现在,说来话长:
find()
返回一个游标。默认情况下,光标将批量将结果传输到客户端。从,:
对于大多数查询,第一批返回101个文档或刚好足够超过1MB的文档。后续批处理大小为4 MB
使用limit()。从而减少带宽消耗和延迟
请注意,考虑到您的用例,您可能还会使用sort()
操作。根据与上述相同的文件:
对于包含没有索引的排序操作的查询,服务器必须在返回任何结果之前加载内存中的所有文档以执行排序
并进一步解释:
如果MongoDB无法通过索引扫描获得排序顺序,则MongoDB使用top-k排序算法。此算法缓冲底层索引或集合访问到目前为止看到的前k个结果(或最后一个,取决于排序顺序)。如果在任何时候,这些k结果的内存占用超过32 MB,则查询将失败1
1该32 MB限制不特定于使用limit()
子句进行排序。任何不能从索引中获得顺序的排序都将受到相同的限制。但是,使用普通排序时,服务器需要在其内存中保存所有文档以对其进行排序。对于有限排序,它只需要同时在内存中存储k个文档。如果您需要按顺序进行排序,那么数据库当然会首先根据标准对其进行排序,然后返回前10条记录。使用该限制只会节省网络带宽。e、 这里我按名字排序,然后给出前10条记录,它必须扫描整个数据,然后选择前10条。(正如您所注意到的,它正在进行COLLSCAN,这被理解为集合扫描,因为我没有这个示例的索引,这里要展示的想法是,它正在对所有记录进行完全扫描,对其进行排序,然后选择最上面的记录。)
Read.Solimit()
减少了带宽消耗和延迟,但没有加快查询速度?@gzc它将减少带宽消耗并加快排序查询。我对我的答案进行了编辑,以更加强调这一点,并提供了到文档中相关段落的链接。
> db.t1.find().sort({name:1}).limit(10).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.t1",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [ ]
},
"winningPlan" : {
"stage" : "SORT",
"sortPattern" : {
"name" : 1
},
"limitAmount" : 10,
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [ ]
},
"direction" : "forward"
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Sachin-Mac.local",
"port" : 27017,
"version" : "3.0.2",
"gitVersion" : "6201872043ecbbc0a4cc169b5482dcf385fc464f"
},
"ok" : 1
}