Mongodb Aggregation Framework:$ group使用索引吗?

fed*_*lov 24 performance mongodb aggregation-framework

我正在尝试使用聚合框架$match$group阶段.$group阶段是否使用索引数据?我正在使用最新的mongodb版本 - 2.5.4

4J4*_*J41 42

$group 不使用索引数据.

来自mongoDB 文档:

$ match和$ sort管道运算符可以在管道开头出现时利用索引.

$ geoNear管道运算符利用地理空间索引.使用$ geoNear时,$ geoNear管道操作必须显示为聚合管道中的第一个阶段.

  • @ArthurTacca:$ sort阶段将使用索引,但$ group阶段不会. (3认同)
  • 我认为您有点书呆子:如果$ sort阶段使用索引,而$ group阶段使用sort的结果来避免昂贵的扫描,那么我会说$ group使用了索引。您在文档中的引用没有说明$ group是否利用先前的$ sort的任何一种方式,因此我认为您并未真正回答原始问题的意图。(以前在3.2文档中的答案中的引号强烈建议答案是“是”,因此是我的原始评论;在3.4文档中的新引号虽然不那么具有暗示性,但仍然含糊不清。) (2认同)

Art*_*cca 5

正如 4J41 的回答所说,$group不(直接)使用索引,尽管$sort它是管道中的第一阶段。但是,$group如果它紧跟$sort在a 之后,原则上似乎可以优化实现,在这种情况下,您可以通过将 a 放在$sort前面来有效地利用索引。

在文档中似乎没有关于是否$group有这种优化的直接答案(尽管我打赌如果有的话就会有,所以这表明它没有)。答案在MongoDB 错误 4507 中:目前$group没有这个实现,所以 4J41 的答案的第一行毕竟是正确的。如果您确实需要效率,根据应用程序,使用常规查询并在客户端代码中进行分组可能是最快的。

编辑:正如塞巴斯蒂安的回答所说,在实践中,似乎$sort在 a 之前使用(可以利用索引)$group可以大大提高速度。上面的错误仍然存​​在,因此它似乎没有充分利用索引的绝对最佳优势(即,在加载项目时开始对项目进行分组,而不是首先将它们全部加载到内存中)。但这仍然是值得做的。


seb*_*ian 5

@ArthurTacca,如蒙戈4.0$sort$group将显著加快东西。请参阅/sf/answers/3949951281/

  • 感谢您跟进答复。这很有趣。我在答案中提到的错误仍然是开放的(MongoDB 员工于 2019 年 6 月 28 日引用了它,所以我认为它的开放并不是一个疏忽)。因此,如果“$sort”可以使用索引,那么在“$group”之前使用“$sort”可能会(非常!)有帮助,但它仍然可以变得更加高效。您观察到的加速可以通过“$group”在内部进行排序来解释,并且许多排序算法在已经排序的列表上是微不足道的。 (2认同)