1.索引
Mongodb的大多数索引是建立在btree上,每个集合最多只能有64个索引
1)单字段索引创建
db.user.createIndex( {age: 1} ) //1表示升序,-1表示降序
db.user.createIndex( {age: 1},{"unique": true} )//唯一索引
db.person.createIndex( {age: 1} ,{spare:ture})创建稀疏索引//针对含有该字段做索引,针对不含该字段不建立索引
db.user.createIndex( {age: 1},... ,...)
参数说明:
background,Boolean,在后台建立索引,以便建立索引时不阻止其他数据库活动。默认值 false。
unique,Boolean,创建唯一索引。默认值 false。
name,String,指定索引的名称。如果未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。
sparse,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。
v,index version,索引的版本号。
weights,document,索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重
2)复合索引创建
db.person.createIndex( {age: 1, name: 1} )
3)删除索引
db.user.dropIndex({age:1/-1})//移除索引
db.collection.dropIndexes();//删除该集合的所有索引
4)索引常用的一些方法
db.user.reindex()//目的类似mysql碎片整理,减少空洞。
db.user.getIndexes()//查看索引
db.user.totalIndexSize()//查看索引所占的空间大小
5)explain()优化分析
db.user.find({age:{$gt:9990}}).explain("executionStats") //执行计划
备注:https://docs.mongodb.com/v3.2/reference/explain-results/#queryplanner
{
"queryPlanner" : {
"plannerVersion" : 1, //计划版本
"namespace" : "admin.user", //库.集合
"indexFilterSet" : false, //是否用到索引,false表示没有
"parsedQuery" : { //解析查询条件,即过滤条件
"age" : {
"$gt" : 9990
}
},
"winningPlan" : { //自动优化后的执行计划
"stage" : "COLLSCAN", //扫描方式:COLLSCAN 全表扫描 ,IXSCAN 索引扫描,FETCH 根索引去检索文档,SHARD_MERGE 合并分片结果等,详情见备注
"filter" : { // 过滤条件
"age" : {
"$gt" : 9990
}
},
"direction" : "forward" //方向forward
},
"rejectedPlans" : [ ] //拒绝的执行计划
},
"executionStats" : { //执行计划信息
"executionSuccess" : true, //执行成功的状态
"nReturned" : 9, //返回结果集数目
"executionTimeMillis" : 2, //执行时间,毫秒
"totalKeysExamined" : 0, //索引扫描条目
"totalDocsExamined" : 10004, //文档扫描条目
"executionStages" : {
"stage" : "COLLSCAN", //略,同queryPlanner的winningPlan
"filter" : {
"age" : {
"$gt" : 9990
}
},
"nReturned" : 9, //返回结果集数目
"executionTimeMillisEstimate" : 0, //预估的执行时间,毫秒
"works" : 10006, //工作单元数
"advanced" : 9, //返回的中间结果数
"needTime" : 9996,
"needYield" : 0,
"saveState" : 78,
"restoreState" : 78,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward", //方向
"docsExamined" : 10004 //文档扫描数
}
},
"serverInfo" : {
"host" : "fatale",
"port" : 27017,
"version" : "3.6.7-14-g7f3489f445",
"gitVersion" : "7f3489f445318e468be4534d7e5eedced033d9a3"
},
"ok" : 1
}
备注:
stage:扫描方式可出现的参数如下
collscan,ixscan,fetch,shard_merge,sort,limit,skip,idhack,sharding_filter,count,countscan,count_scan,subpla,text,projection;
不希望看到:collscan(全表扫),sort(使用sort但是无index),skip,subpla(未用到index的$or)
希望看到的:IXSCAN 索引扫描,FETCH 根索引去检索文档
待续。。。。