设为首页 收藏本站
查看: 1519|回复: 0

[经验分享] mongoDB的索引

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-4-3 09:38:32 | 显示全部楼层 |阅读模式

索引通常能够极大的提高查询的效率。在系统中使用查询时,应该考虑建立相关的索引。

索引是一种数据结构,他搜集一个集合中文档特定字段的值。MongoDB的查询优化器能够

使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序,

准确来说,这些索引是通过B-Tree索引来实现的。


1.创建简单索引

   数据准备index.js,创建books文档并插入200000条数据,如下:
   for(var i=0;i<200000;i++){
       db.books.insert({number:i,name:i+"book"})
   }

        1.先检验一下查询性能

            var start = new Date()

            db.books.find({number:65871})

            var end = new Date()

            end - start

         2.为number 创建索引

            db.books.ensureIndex({number:1})

         3.再执行第一部的代码可以看出有数量级的性能提升

2.索引使用需要注意的地方

         1.创建索引的时候注意1是正序创建索引-1是倒序创建索引

         2.索引的创建在提高查询性能的同事会影响插入的性能对于经常查询少插入的文档可以考虑用索引

         3.符合索引要注意索引的先后顺序

         4.每个键全建立索引不一定就能提高性能呢索引不是万能的

         5.在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能

3.创建索引同时指定索引的名字

          db.books.ensureIndex({name:-1},{name:”bookname”})

4.唯一索引

     4.1如何解决文档books不能插入重复的数值

           建立唯一索引

          db.books.ensureIndex({name:-1},{unique:true})

          试验

          db.books .insert({name:”1book”})

5.剔除重复值

      5.1如果建议唯一索引之前已经有重复数值如何处理

          db.books.ensureIndex({name:-1},{unique:true,dropDups:true})

6.Hint

      6.1如何强制查询使用指定的索引呢?

           db.books.find({name:"1book",number:1}).hint({name:-1})

            指定索引必须是已经创建了的索引

7.Expain

        7.1如何详细查看本次查询使用那个索引和查询数据的状态信息

          db.books.find({name:"1book"}).explain()

返回结果,如下所示:
> db.books.find({name:"1book"}).explain()
{
        "cursor" : "BtreeCursor name_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "name" : [
                        [
                                "1book",
                                "1book"
                        ]
                ]
        },
        "server" : "PC-20110917QHJT:27017"
}


"cursor" : "BtreeCursor name_1"  使用索引
"nscanned" : 1   查到几个文档
"millis" : 0   查询时间,0是很不错的性能

二、索引管理
8、system.indexes
8.1、在shell中,查看数据库已经建立的索引。如下:
db.system.indexes.find()
db.system.namespaces.find()

9、后台执行
9.1、执行创建索引的过程会暂时锁表问题,如何解决?
    为了不影响查询,我们可以让索引的创建过程在后台执行。
    db.books.ensureIndex({number:1},{true})

10、删除索引
10.1、批量和精确删除索引
db.runCommand({dropIndexes:"books",index:"name_1"}) 精确删除索引
db.runCommand({dropIndexes:"books",index:"*"})   批量删除索引

三、空间索引
11、mongoDB提供强大的空间索引,可以查询出一定范围的地理坐标。示例如下:
准备数据map.txt,如下图:

var map = [{
  "gis" : {
    "x" : 185,
    "y" : 150
  }
},{
  "gis" : {
    "x" : 70,
    "y" : 180
  }
},{
  "gis" : {
    "x" : 75,
    "y" : 180
  }
},{
  "gis" : {
    "x" : 185,
    "y" : 185
  }
},{
  "gis" : {
    "x" : 65,
    "y" : 185
  }
},{
  "gis" : {
    "x" : 50,
    "y" : 50
  }
},{
  "gis" : {
    "x" : 50,
    "y" : 50
  }
},{
  "gis" : {
    "x" : 60,
    "y" : 55
  }
},{
  "gis" : {
    "x" : 65,
    "y" : 80
  }
},{
  "gis" : {
    "x" : 55,
    "y" : 80
  }
},{
  "gis" : {
    "x" : 0,
    "y" : 0
  }
},{
  "gis" : {
    "x" : 0,
    "y" : 200
  }
},{
  "gis" : {
    "x" : 200,
    "y" : 0
  }
},{
  "gis" : {
    "x" : 200,
    "y" : 200
  }
}]
for(var i = 0;i<map.length;i++){
db.map.insert(map)
}

首先,添加2D索引(默认会建立一个[-180,180]之间的2D索引)
db.map.ensureIndex({"gis":"2d"},{min:-1,max:201})
11.1、查询出距离点(70,180)最近的3个点
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)//$near操作符表示中心点;如果没有指定limit,其默认值为100。
11.2、查询以点(50,50)和(190,190)为对角线的正方形中的所有点
var box=[[50,50],[190,190]];//定义一个矩形区域
db.map.find({"gis":{"$within":{"$box":box}}},{gis:1,_id:0})//$box 矩形查找
11.3、查询出以圆心为(55,80),半径为50,规则下的圆心面积中的点
var center=[55,80];//定义中心点
var radius=50;//定义半径
db.map.find({"gis":{"$within":{"$center":[center,radius]}}});//$center 圆形查找(注意这里是数组传递)




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-16723-1-1.html 上篇帖子: Mongodb与Redis应用指标对比 下篇帖子: MongoDB数据库简介及安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表