我们有一个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错误:溢出排序阶段缓冲数据使用错误。这似乎意味着这种排序是在记忆中完成的。这是因为它正在进行内存合并排序的子句?或者是否有其他原因可能会发生此错误?
你可以发布查询的完整说明吗? – wdberkeley 2014-12-05 16:50:37
也许mongo无法合并排序的相似部分结果。如果您仅查询{from:“a”}和{from:“b”},请执行这些工作吗?一种解决方法可能是在mongo之外手动合并。 – Andras 2015-03-06 15:51:14