【发布时间】:2015-06-20 06:05:15
【问题描述】:
我有一个大型 MongoDB 集合,包含超过 2GB 的原始数据,我使用一个非常简单的查询通过其 Id 从集合中获取特定文档。文档大小目前从 10KB 到 4MB 不等,Id 字段定义为索引。
这是我正在使用的查询(使用 mongojs 模块):
db.collection('categories').find({ id: category_id },
function(err, docs) {
callback(err, docs.length ? docs[0] : false);
}).limit(1);
当我使用 MongoDB shell 或 Robomongo 等 GUI 执行此查询时,无论其物理大小如何,获取文档大约需要 1 毫秒,但是当我在 NodeJS 上执行完全相同的查询时,响应时间范围从 2 毫秒到2s 或更多,具体取决于数据量。我只测量接收响应所需的时间,即使在 NodeJS 等待超过 500 毫秒的情况下,MongoDB 分析器 (.explain()) 也显示执行查询只需要一毫秒。
现在,我可能做错了什么,但我不知道是什么。我对 NodeJS 比较陌生,但我过去曾使用过 MongoDB 和 PHP,而且我从未遇到过这样的性能问题,所以我倾向于认为我可能以某种方式滥用了 NodeJS。
我还尝试在 WebStorm 上使用 SpyJS 进行分析,我看到有很多 bson.deserialize 调用很快就会汇总成一个大堆栈,但我无法进一步调查,因为此时 SpyJS 总是崩溃。可能相关,但我仍然不知道如何处理它。
请告知,任何线索将不胜感激。
编辑:
这是db.categories.getIndexes()的结果:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "my_db.categories"
},
{
"v" : 1,
"key" : {
"id" : 1
},
"name" : "id_1",
"ns" : "my_db.categories"
}
]
我也尝试过使用findOne,但没有任何区别:
db.collection('categories').findOne({ id: category_id },
function(err, doc) {
callback(err, doc || false);
});
【问题讨论】:
-
在
id字段上创建的任何索引? -
只有
_id上的默认索引和我在id上添加的索引,这是类别ID 的数字表示。 -
尝试一下,如果您过滤掉数据中的特定字段,它会突然快速加载吗?也许有一些奇怪的转换节点正在阻塞。
-
你的文档是超级嵌套的吗?
-
它非常嵌套,有几个深度。我喜欢你的想法,我会试试看。
标签: node.js performance mongodb profiling mongojs