mongodb:limit()会提高查询速度吗?

gzc*_*gzc 3 mongodb

db.inventory.find().limit(10)快吗db.inventory.find()

我在 mongodb 中有数百万条记录,我想获取某些订单中的前 10 条记录。

Syl*_*oux 7

使用limit()您通知服务器您不会检索超过k 个文档。允许进行一些优化以减少带宽消耗并加快排序速度。最后,使用限制子句,服务器将能够在 RAM 中排序时更好地使用可用的最大 32MB(即:当无法从索引获取排序顺序时)。


现在,长话短说:find()返回一个光标。默认情况下,游标会将结果批量传输到客户端。从文档中,:

对于大多数查询,第一批返回 101 个文档或刚好足以超过 1 MB 的文档。后续批量大小为 4 MB。

使用limit()游标不需要检索不必要的文档。从而减少带宽消耗和延迟。

请注意,根据您的用例,您可能也会使用sort()操作。来自与上面相同的文档:

对于包含没有索引的排序操作的查询,服务器必须加载内存中的所有文档以在返回任何结果之前执行排序。

sort () 文档页面进一步解释:

如果 MongoDB 无法通过索引扫描获得排序顺序,则 MongoDB 使用 top-k 排序算法。该算法缓冲底层索引或集合访问迄今为止看到的前 k 个结果(或最后一个,取决于排序顺序)。如果在任何时候这 k 个结果的内存占用超过 32 MB,则查询将失败1


1 32 MB 限制并非特定于使用limit()子句进行排序。任何无法从索引获取顺序的排序都会受到相同的限制。然而,使用普通排序,服务器需要将所有文档保存在内存中才能对它们进行排序。在有限排序的情况下,它只需同时在内存中存储k 个文档。