0

我正在对我的 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 个字段,并且所有的查询字段都被索引了。

我错过了什么吗?

4

0 回答 0