我正在做一些剖析&优化我的MongoDB服务器,并发现99%的慢查询(大约100毫秒,每个Database Profiler)是由于我的node.js代码中的单个查询。
首先,这是我如何建模我的缓存(通过猫鼬):
{
'_id': { type: String, unique: true},
'group': { type: String, index: true },
'post_time_msec': { type: Number, index: true },
'stream_type': { type: String },
'stream_name': { type: String },
'stream_id': { type: String },
'stream_key': { type: String },
'last_updated': { type: Date },
'data': {},
'bookmarks': { type: Number },
}
现在,我的查询很慢。 我寻找属于某个“组”字段的对象。也就是说,我想找到组中所有对象的“post_time_msec”,这样我就可以判断是否需要更新这些对象。
node.js和mongo中的查询如下所示:
var thegroup = ... // this is set earlier
model.find({'group': thegroup}, {'_id': true, 'post_time_msec': true}, {'limit': 300, 'sort': {'post_time_msec': -1}});
我还经常清理集合,当属于某个组的集合中有超过300个时删除额外的对象(这样,查询不应该查看数千条记录......)
当我查看mongo分析器时,这是一个慢慢运行的查询示例:
{ "ts" : ISODate("2012-10-03T05:00:29.802Z"), "op" : "query", "ns" : "streamified.postcaches", "query" : { "query" : { "group" : "network/group/2934jq98239oeu1" }, "orderby" : { "post_time_msec" : -1 } }, "ntoreturn" : 300, "nscanned" : 305, "scanAndOrder" : true, "nreturned" : 300, "responseLength" : 31520, "millis" : 985, "client" : "10.179.35.87", "user" : "" }
正如您所看到的,此查询需要将近1秒钟才能完成。它只扫描了305行,只返回了2个字段,所有查询字段都被编入索引。
我错过了什么吗?