【发布时间】:2015-02-02 11:12:59
【问题描述】:
我们正在运行一个 mongoDB 2.6.4 副本集,并正在尝试诊断此行为。当我们预计不会收到时,我们会收到Runner error: Overflow sort stage buffered data usage of 33598393 bytes exceeds internal limit of 33554432 bytes。该集合有数百万条记录,并有一个复合索引,其中包括正在排序的键。举个例子
索引看起来像这样
{ from: 1, time : -1, otherA : 1, otherB : 1}
我们的发现是
find.collection({ from : { $in : ["a", "b"] }, time : { $gte : timestamp },
otherA : {$in:[...]}, otherB : {$in:[...]}})
.sort( time : -1 )
mongoDB 类似这样的查询(子句):
{ from : a }, { time : { $gte : timestamp }, ... }
{ from : b }, { time : { $gte : timestamp }, ... }
在解释中,每个阶段都报告 scanAndOrder : false,这意味着使用索引来返回结果。这一切似乎都很好,但是 mongoDB 客户端收到 Runner 错误:溢出排序阶段缓冲数据使用错误。这似乎暗示排序是在内存中完成的。这是因为它正在对子句进行内存合并排序吗?还是有其他原因导致此错误发生?
【问题讨论】:
-
你能发布完整的查询解释吗?
-
也许 mongo 无法合并已排序的平行部分结果。如果您只查询 {from: "a"} 和 {from: "b"},这些行得通吗?一种解决方法是在 mongo 之外手动合并。