Mongodb 为什么mongo不';你不能使用正确的索引吗?
我使用MongoDB以以下结构存储数据:Mongodb 为什么mongo不';你不能使用正确的索引吗?,mongodb,Mongodb,我使用MongoDB以以下结构存储数据: { "_id" : ObjectId("5a497a1f451bf00880331913"), "device" : "deviceId", "topic" : "topicId", "vhost" : "vhostId", "date" : ISODate("2018-01-01T00:00:31.220Z"), "value" : 452 } 具有以下索引: [ { "v" : 2,
{ "_id" : ObjectId("5a497a1f451bf00880331913"), "device" : "deviceId", "topic" : "topicId", "vhost" : "vhostId", "date" : ISODate("2018-01-01T00:00:31.220Z"), "value" : 452 }
具有以下索引:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "thingsplay.data"
},
{
"v" : 2,
"key" : {
"device" : 1,
"topic" : 1,
"date" : 1
},
"name" : "device_1_topic_1_date_1",
"ns" : "thingsplay.data",
"background" : true
},
{
"v" : 2,
"key" : {
"device" : 1,
"topic" : 1,
"vhost" : 1
},
"name" : "device_1_topic_1_vhost_1",
"ns" : "thingsplay.data",
"background" : true
}
]
但当我用设备、主题和日期字段进行查询时,它使用设备、主题、vhost、索引
对于另一个使用解释选项的请求,我刚刚有了正确的获胜计划(设备\u 1\u主题\u 1\u日期\u 1),但当我执行它时。。。我仍然在等待它完成,并且使用db.currentOp()
我没有看到它使用任何索引
{
"desc" : "conn2172",
"threadId" : "2836",
"connectionId" : 2172,
"client" : "x.x.x.x:50177",
"appName" : "MongoDB Shell",
"clientMetadata" : {
"application" : {
"name" : "MongoDB Shell"
},
"driver" : {
"name" : "MongoDB Internal Client",
"version" : "3.6.2"
},
"os" : {
"type" : "Windows",
"name" : "Microsoft Windows Server 2008 R2",
"architecture" : "x86_64",
"version" : "6.1 SP1 (build 7601)"
}
},
"active" : true,
"opid" : 22137990,
"secs_running" : 322,
"microsecs_running" : NumberLong(322246758),
"op" : "command",
"ns" : "company.data",
"query" : {
"explain" : {
"find" : "data",
"filter" : {
"device" : "deviceId",
"topic" : "topicId",
"date" : {
"$gt" : ISODate("2018-01-01T00:00:00Z"),
"$lt" : ISODate("2018-06-12T16:18:00Z")
}
}
},
"verbosity" : "executionStats"
},
"numYields" : 19245,
"locks" : {
"Global" : "r",
"Database" : "r",
"Collection" : "r"
},
"waitingForLock" : false,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(38492)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(19246)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(19246)
}
}
}
}
我不明白为什么没有使用索引…查询中也有vhost。显然,查询计划员认为此索引更有效。您的查询是什么?@AlexBlex否我没有在查询中指定vhost。。。这就是为什么我不明白为什么它使用那个索引…@MạnhQuyế特恩盖伊ễn我没有这个示例的具体查询,但它看起来像:db.data.find({device:“deviceId”,topic:“topicId”,date:{$gt:ISODate(“2018-01-01T00:00:00.000Z”),$lt:ISODate(“2018-06-13T12:00:00.000Z”)})足够公平。您能否提供解释结果和
allPlansExecution
stats?