扫码一下
查看教程更方便
分析查询是衡量数据库和索引设计有效性的一个非常重要的方面。本章我们将了解常用的 explain 和 hint 查询。
explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。
在上一章节中,我们已经用以下查询在 users集合中对gender和user_name字段创建了索引
>db.users.createindex({gender:1,user_name:1})
{
"numindexesbefore" : 2,
"numindexesafter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
现在在查询语句中使用 explain :
>db.users.find({gender:"m"},{user_name:1,_id:0}).explain()
以上的 explain() 查询返回如下结果:
{
"queryplanner" : {
"plannerversion" : 1,
"namespace" : "mydb.users",
"indexfilterset" : false,
"parsedquery" : {
"gender" : {
"$eq" : "m"
}
},
"queryhash" : "b4037d3c",
"plancachekey" : "deaae17c",
"winningplan" : {
"stage" : "projection_covered",
"transformby" : {
"user_name" : 1,
"_id" : 0
},
"inputstage" : {
"stage" : "ixscan",
"keypattern" : {
"gender" : 1,
"user_name" : 1
},
"indexname" : "gender_1_user_name_1",
"ismultikey" : false,
"multikeypaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isunique" : false,
"issparse" : false,
"ispartial" : false,
"indexversion" : 2,
"direction" : "forward",
"indexbounds" : {
"gender" : [
"[\"m\", \"m\"]"
],
"user_name" : [
"[minkey, maxkey]"
]
}
}
},
"rejectedplans" : [ ]
},
"serverinfo" : {
"host" : "krishna",
"port" : 27017,
"version" : "4.2.1",
"gitversion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
现在,我们看看这个结果集的字段:
虽然mongodb查询优化器一般工作的很不错,但是也可以使用 hint 来强制 mongodb 使用一个指定的索引。
这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。
如下查询实例指定了使用 gender 和 user_name 索引字段来查询:
>db.users.find({gender:"m"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
可以使用 explain() 函数来分析以上查询:
>db.users.find({gender:"m"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
输出结果如下:
{
"queryplanner" : {
"plannerversion" : 1,
"namespace" : "mydb.users",
"indexfilterset" : false,
"parsedquery" : {
"gender" : {
"$eq" : "m"
}
},
"queryhash" : "b4037d3c",
"plancachekey" : "deaae17c",
"winningplan" : {
"stage" : "projection_covered",
"transformby" : {
"user_name" : 1,
"_id" : 0
},
"inputstage" : {
"stage" : "ixscan",
"keypattern" : {
"gender" : 1,
"user_name" : 1
},
"indexname" : "gender_1_user_name_1",
"ismultikey" : false,
"multikeypaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isunique" : false,
"issparse" : false,
"ispartial" : false,
"indexversion" : 2,
"direction" : "forward",
"indexbounds" : {
"gender" : [
"[\"m\", \"m\"]"
],
"user_name" : [
"[minkey, maxkey]"
]
}
}
},
"rejectedplans" : [ ]
},
"serverinfo" : {
"host" : "krishna",
"port" : 27017,
"version" : "4.2.1",
109
"gitversion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}