MongoDB 索引和 explain 的使用
2020-12-03 本文已影响0人
shadow123
索引基础
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。MongoDB 的索引几乎与传统的关系型数据库一模一样。
创建索引的命令:
db.user.ensureIndex({"username":1})
获取当前集合的索引:
db.user.getIndexes()
删除索引的命令:
db.user.dropIndex({"username":1})
创建复合索引:
db.user.ensureIndex({"username":1,"age":-1})
其中 1 表示 username
键的索引按升序存储,-1 表示 age
键的索引按降序存储。
复合索引被创建后,基于 username 和 age 的查询将会用到复合索引,或者是基于 username
的查询也会用到复合索引, 但是只是基于 age 的查询将不会用到复合索引。
指定索引名:
db.user.ensureIndex({"username":1},{"name":"username"})
唯一索引
在缺省情况下创建的索引均不是唯一索引。
创建唯一索引:
db.user.ensureIndex({"username":1},{"unique”:true})
如果重复插入username
键,MongoDB 将会报错。如果插入的文档中不包含 username
键,那么该文档中该键的值为 null
,如果多次插入类似的文档,MongoDB 将会报出同样的错误。
db.user.insert({"username","user001"})
db.user.insert({"username","user001"})
// errmsg "E11000 duplicate key error collection: admin.user index: username_1 dup key: { username: \"user001\" }"
db.user.insert({"age":18})
db.user.insert({"age":18})
// errmsg "E11000 duplicate key error collection: admin.user index: username_1 dup key: { username: null }"
索引的参数
-
background
:创建索引过程会阻塞其它数据库操作,background
可指定以后台方式创建索引。默认值为false
。 -
unique
:创建索引是否唯一,默认值为false
。 -
name
:索引的名称。 -
dropDups
:在创建唯一索引时是否删除重复记录,默认值为false。
在后台创建索引:
db.ensureIndex({"username":1},{"background":true})
explain
explain 会帮助你获取查询方面诸多有用的信息。
用法:
db.user.find({"username":"user001"}).explain("executionStats")
// explain.executionStats.executionTimeMillis 毫秒时间
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "admin.user",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "user001"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "user001"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 2,
"executionTimeMillis" : 87,
"totalKeysExamined" : 0,
"totalDocsExamined" : 100003,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "user001"
}
},
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 100005,
"advanced" : 2,
"needTime" : 100002,
"needYield" : 0,
"saveState" : 781,
"restoreState" : 781,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 100003
}
},
"serverInfo" : {
"host" : "DESKTOP-4VM2FGH",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1