1. 索引 #

mongoindex

2 建立索引 #

2.1 插入数据 #

var students = [];
for(var i=1;i<=300000;i++){
   students.push({name:'zfpx'+i,age:i,random:i});
}
 db.students.insert(students);
db.students.find({age:299999}).explain(true);// "executionTimeMillis" : 245,

2.1.2 创建匿名索引 #

db.students.ensureIndex({age:1});
db.students.find({age:299999}).explain(true);// "executionTimeMillis" : 7,

2.1.3 创建命名索引 #

db.students.ensureIndex({name:1},{name:'namedIndex'});
db.students.getIndexes()//查看索引

2.1.4 分析索引的执行过程 #

MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。

db.students.find({name:'zfpx150000'}).explain();

2.1.5 指定使用的索引 #

db.students.find({name:'zfpx299999',age:299999}).hint({name:1}).explain(true);

2.1.6 创建唯一索引并删除重复记录 #

db.person.ensureIndex({ "name" : -1 },{ "name" : "indexname", "unique" : true,dropDups:true })

2.1.7 删除索引 #

db.students.dropIndex('namedIndex');//删除指定的索引
db.students.dropIndex('*');
db.runCommand({dropIndexes:"students",index:"namedIndex"});//删除所有的索引

2.1.8 在后台创建索引 #

db.students.ensureIndex({name:1},{name:'nameIndex',unique:true,background:true});

2.1.9 建立多键索引 #

mongodb可以自动对数组进行索引

db.students.insert({hobby:['basketball','football','pingpang']});
db.students.ensureIndex({hobby:1});
db.students.find({hobby:'football'},{hobby:1,_id:0}).explain(true);

2.1.10 复合索引 #

查询的条件不止一个,需要用复合索引

db.students.ensureIndex({name:1,age:1});
db.students.find({name:1,age:2},{name:1,age:1,_id:0}).explain(true);

2.1.11 过期索引 #

在一定的时间后会过期,过期后相应数据数据被删除,比如 session、日志、缓存和临时文件

db.stus.insert({time:new Date()});
db.stus.ensureIndex({time:1},{expireAfterSeconds:10});
db.stus.find();

2.1.12 全文索引 #

大篇幅的文章中搜索关键词,MongoDB为我们提供了全文索引

db.article.insert({content:'I am a gir'});
db.article.insert({content:'I am a boy'});
db.article.find({$text:{$search:'boy'}});
db.article.find({$text:{$search:'girl'}});
db.article.find({$text:{$search:'boy girl'}});//多次查找,多个关键字为或的关系
db.article.find({$text:{$search:"a b"}}); 
db.article.find({$text:{$search:"boy -girl"}}); // -表示取消
db.article.find({$text:{$search:"a \"coco cola\" b "}}); //支持转义符的,用\斜杠来转义

2.2 二维索引 #

mongodb提供强大的空间索引可以查询出一定落地的地理坐标

[{ gis : { x : 50 , y : 30 } ];

2.2.1 创建2D索引 #

db.maps.ensureIndex({gis:'2d'},{min:1,max:3});
默认会创建一个2D索引

2.2.2 查询出距离点()最近的3个点 #

db.maps.find({gis:{$near:[1,1]}}).limit(3);

2.2.3 查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点 #

db.map.find({gis:{$within:{$box:[[1,1],[2,2]]}}},{_id:0,gis:1});

2.2.4 查出以圆心为为半径为规则下圆心面积中的点 #

db.maps.find({gis:{$within:{$center:[[2,2],1]}}},{_id:0,gis:1});

2.2.5 索引使用的注意事项 #

  1. 1为正序 -1为倒序
  2. 索引虽然可以提升查询性能,但会降低插件性能,对于插入多查询少不要创索引
  3. 数据量不大时不需要使用索引。性能的提升并不明显,反而大大增加了内存和硬盘的消耗。
  4. 查询数据超过表数据量30%时,不要使用索引字段查询
  5. 排序工作的时候可以建立索引以提高排序速度
  6. 数字索引,要比字符串索引快的多

附录 #

queryPlanner分析 #

对executionStats返回逐层分析 #