我正在对我的 MongoDB 服务器进行一些分析和优化,发现我 99% 的慢查询(根据Database Profiler超过 100 毫秒)是由于我的 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 profiler 时,这里有一个查询运行缓慢的示例:
{ "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 个字段,并且所有的查询字段都被索引了。
我错过了什么吗?