$sort + $limit
内存优化
当$sort
在$limit
之前,且中间没有修改文档数量的阶段时,优化器可以将$limit
合并到$sort
这样,$sort
操作在进行过程中只保留前n
个结果(其中n
是指定的限制),并确保MongoDB只需在内存中存储n
个条目。当allowDiskUse
为true
且n
项超过聚合内存限制时,该优化仍然适用。不同版本之间的优化可能会有变化。
$sort
和内存限制
$sort
受100M内存使用限制,但如果需要,可以将临时文件写入磁盘。从 MongoDB 6.0开始,需要超过100MB内存才能执行的管道阶段默认会将临时文件写入磁盘。在MongoDB早期版本中,要启用此行为,必须传递{ allowDiskUse: true }
。
单个find
和aggregate
命令可以通过以下任一方式覆盖allowDiskUseByDefault
参数:
-
当
allowDiskUseByDefault
设置为false
时,使用{ allowDiskUse: true}
可以把临时文件写入磁盘 -
当
allowDiskUseByDefault
设置为true
时,使用{ allowDiskUse: false}
将禁止把临时文件写入磁盘。
$sort
和性能
如果$sort
用于管道的第一阶段,或仅在$match
阶段之前使用,则可以利用索引的优势。
当使用$sort
时,每个分片会使用可用的索引对文档进行排序,然后,mongos
或其中一个分片执行流式合并排序。