我有一个工作得很好的NodeJS MongoDB,我注意到的唯一问题是mongo正在记录我的大量查询。我尝试了不同的索引策略,但它保持不变。 mongo和node之间的通信是由mongoose完成的。
查询案例1:
Sun May 11 01:15:26.076 [conn5] query api.items query: { $query: { gameid: 209670, appid: 102 }, orderby: { price: -1 } } ntoreturn:0 ntoskip:0 nscanned:29 scanAndOrder:1 keyUpdates:0 numYields: 1 locks(micros) r:382458 nreturned:29 reslen:22686 240ms
Sun May 11 01:24:44.950 [conn5] query api.items query: { $query: { gameid: 248820, appid: 102 }, orderby: { price: -1 } } ntoreturn:0 ntoskip:0 nscanned:20 scanAndOrder:1 keyUpdates:0 locks(micros) r:78688 nreturned:20 reslen:16281 110ms
项目集合:
var itemSchema = new Schema({
appid : {type: Number, required: true},
gameid : {type: Number, required: true},
name : {type: String, required: true},
hash : {type: String, index: true},
price : Number,
date : Date
});
itemSchema.set('versionKey', false);
itemSchema.index({ appid: 1, gameid: 1 });
itemSchema.index({ gameid: 1 });
我有一套大约20.000个项目,对于所有这些项目,appid是102,并且有800个gameid。所有这些都有一个独特的ObjectId。
RockMongo告诉我可以使用以下索引:
当我对查询做一个解释时:
Response from server:
{
"cursor": "BtreeCursor appid_1_gameid_1",
"isMultiKey": false,
"n": NumberInt(20),
"nscannedObjects": NumberInt(20),
"nscanned": NumberInt(20),
"nscannedObjectsAllPlans": NumberInt(60),
"nscannedAllPlans": NumberInt(60),
"scanAndOrder": true,
"indexOnly": false,
"nYields": NumberInt(0),
"nChunkSkips": NumberInt(0),
"millis": NumberInt(25),
"indexBounds": {
"appid": [
[
102,
102
]
],
"gameid": [
[
248820,
248820
]
]
},
"allPlans": [
{
"cursor": "BtreeCursor appid_1_gameid_1",
"n": NumberInt(20),
"nscannedObjects": NumberInt(20),
"nscanned": NumberInt(20),
"indexBounds": {
"appid": [
[
102,
102
]
],
"gameid": [
[
248820,
248820
]
]
}
},
{
"cursor": "BtreeCursor gameid_1",
"n": NumberInt(20),
"nscannedObjects": NumberInt(20),
"nscanned": NumberInt(20),
"indexBounds": {
"gameid": [
[
248820,
248820
]
]
}
},
{
"cursor": "BasicCursor",
"n": NumberInt(0),
"nscannedObjects": NumberInt(20),
"nscanned": NumberInt(20),
"indexBounds": [
]
}
],
"oldPlan": {
"cursor": "BtreeCursor appid_1_gameid_1",
"indexBounds": {
"appid": [
[
102,
102
]
],
"gameid": [
[
248820,
248820
]
]
}
},
"server": ---
}
答案 0 :(得分:2)
MongoDB记录慢于100毫秒的查询(配置文件级别1,默认slowms
)。您可以使用profile命令更改阈值。
通过查看explain
命令,我认为服务器的性能是个问题。你的explain命令在25ms内完成,所以它只能是服务器上的高负载引起的临时事情。检查您的彩信统计信息。
关于索引的建议很少。
您应该考虑从gameid
和price
列创建compound index,因为如果sort函数消耗超过32MB,MongoDB将返回错误。
如果集合中的所有文档都具有相同的appId
,那么您可以从该字段中删除索引,因为它没有得到有效使用。