一、explain函数
explain函数可以提供大量查询相关的信息,如果是慢查询,它最重要的诊断工具。例如:
在有索引的字段上查询:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
> db.post.
find
({
"loc.city"
:
"ny"
}).explain()
{
"cursor"
:
"BtreeCursor loc.city_1"
,
"isMultiKey"
:
false
,
"n"
: 0,
"nscannedObjects"
: 0,
"nscanned"
: 0,
"nscannedObjectsAllPlans"
: 0,
"nscannedAllPlans"
: 0,
"scanAndOrder"
:
false
,
"indexOnly"
:
false
,
"nYields"
: 0,
"nChunkSkips"
: 0,
"millis"
: 1,
"indexBounds"
: {
"loc.city"
: [
[
"ny"
,
"ny"
]
]
},
"server"
:
"localhost.localdomain:27017"
,
"filterSet"
:
false
}
>
|
在没有索引的的字段上查询:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
> db.post.
find
({
"name"
:
"joe"
}).explain()
{
"cursor"
:
"BasicCursor"
,
"isMultiKey"
:
false
,
"n"
: 2,
"nscannedObjects"
: 15,
"nscanned"
: 15,
"nscannedObjectsAllPlans"
: 15,
"nscannedAllPlans"
: 15,
"scanAndOrder"
:
false
,
"indexOnly"
:
false
,
"nYields"
: 0,
"nChunkSkips"
: 0,
"millis"
: 0,
"server"
:
"localhost.localdomain:27017"
,
"filterSet"
:
false
}
>
|
对比上面两个查询,对explain结果中的字段的解释:
“cursor”:“BasicCursor”表示本次查询没有使用索引;“BtreeCursor loc.city_1 ”表示使用了loc.city上的索引;
“isMultikey”表示是否使用了多键索引;
“n”:本次查询返回的文档数量;
“nscannedObjects”:表示按照索引指针去磁盘上实际查找实际文档的次数;
”nscanned“:如果没有索引,这个数字就是查找过的索引条目数量;
“scanAndOrder”:是否对结果集进行了排序;
“indexOnly”:是否利用索引就能完成索引;
“nYields”:如果在查询的过程中有写操作,查询就会暂停;这个字段代表在查询中因写操作而暂停的次数;
“ millis”:本次查询花费的次数,数字越小说明查询的效率越高;
“indexBounds”:这个字段描述索引的使用情况,给出索引遍历的范围。
"filterSet" : 是否使用和索引过滤;
二、hint函数
如果发现MongoDB使用的索引和自己企望的索引不一致。,可以使用hit函数强制MongoDB使用特定的索引。例如
1
|
>db.
users
.
find
({“age”:1,”username”:/.*/}).hint({“username”:1,”age”:1})
|
本文转自 bannerpei 51CTO博客,原文链接:http://blog.51cto.com/281816327/1601477,如需转载请自行联系原作者