mongoDB的索引

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

  索引是一种数据结构,他搜集一个集合中文档特定字段的值。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

  db.map.insert(map[i])

  }


  首先,添加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 圆形查找(注意这里是数组传递)

时间: 2024-10-03 16:36:13

mongoDB的索引的相关文章

pymongo给mongodb创建索引的简单实现方法

  这篇文章主要介绍了pymongo给mongodb创建索引的简单实现方法,涉及Python使用pymongo模块操作mongodb的技巧,需要的朋友可以参考下 下面的代码给user的user_name字段创建唯一索引 ? 1 2 3 4 import pymongo mongo = pymongo.Connection('localhost') collection = mongo['database']['user'] collection.ensure_index('user_name',

mondodb-C#声明一个mongodb地理位置索引,并修改索引范围

问题描述 C#声明一个mongodb地理位置索引,并修改索引范围 默认情况下,mongodb地理空间索引假定你在索引经度/维度,并且这些值的范围是[-180180].但是我的坐标是大地坐标,不是经纬度,怎么在C#声明一个mongodb地理位置索引,并修改索引范围?shell是这样修改的:db.places.ensureIndex( { loc : ""2d"" } { min : -500 max : 500 } ) 解决方案 这里有现成的http://blog.c

数据-mongodb创建索引后过段时间就消失了?

问题描述 mongodb创建索引后过段时间就消失了? 对A,B两个集合同时创建两组复合索引,索引字段都才4个,创建成功后查询速度比原来快多了.过一天后查询看发现A集合又慢了,发现A集合的复合索引没有了,B集合的索引还在.(A集合数据比较大一大) 给A重新创建了几次索引,都是过段时间索引就自动消失了.要重新创建.求解啊 解决方案 这个应该不会主动消失 是不是倒入数据的时候又覆盖索引 解决方案二: 这个不应该把,索引创建了,只有有人删除了,才会没有. 不太可能说没人删除,就自动没有了,那mongod

MongoDB 复合索引

MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形.其次复合索引在使用的时候,也可以通过前缀法来使用索引.MongoDB中的复合索引与关系型数据库基本上一致.在关系型数据库中复合索引使用的一些原则同样适用于MongoDB.本文主要描述MongoDB复合索引. 一.复合索引相关概述 1.复合索引创建语法 db.collection.createIndex( { <field1>: <type>,

MongoDB 唯一索引

MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等.同时索引的属性可以具有唯一性,即唯一索引.唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性.缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引.本文主要描述唯一索引的用法. 一.创建唯一索引语法 //语法 db.collection.createIndex( <key and index type specification>, { unique:

MongoDB的索引代码实现--BtreeBasedAccessMethod

MongoDB的索引代码实现--BtreeBasedAccessMethod 前言 学习开源软件的最好的办法就是阅读代码,MongoDB整个代码库有接近90万行代码,DB核心层大概50万行,代码量确实非常多.本文作为MongoDB代码导读的第一篇,从Index部分上入手分析代码实现.为何从索引部分开始介绍,首先代码量较少,总共5000多行,且相对其他模块来说比较独立:其次索引对数据库的优化至关重要,了解其实现,对日后的运维优化和索引自身的限制约定都具有实际意义.毕竟文档上的描述还是没有代码来的准

MongoDB 部分索引(Partial Indexes)

MongoDB部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引.由于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本.部分索引通过指定过滤条件来创建,可以为MongoDB支持的所有索引类型使用部分索引. 一.语法描述 创建部分索引语法 db.collection.createIndex(keys, options) options可以使用partialFilterExpression,即部分过滤表达式,其类型为文档类型 过滤表达式通

mongodb[七]索引

介绍:         索引在很多数据库中是提高性能的标志优化手段,所以在大数据量的情况下索引可以提高数据的查询速度,如果没有索引mongodb会扫描全部数据,才能获取满足条件的内容,在关系数据库中可以使用强制索引方式查询数据库,确保更准确快速的查询到满足条件的数据. 语法:         1.ensureIndex()  基本语法  1 创建升序索引  -1创建降序索引         2.mongodb 默认所以字段  _id ,创建文档,会自动创建,此索引不能删除由mongodb自己维护

MongoDB TTL索引

TTL索引是一种特殊类型的单字段索引,主要用于当满足某个特定时间之后自动删除相应的文档.也就是说集合中的文档有一定的有效期,超过有效期的文档就会失效,会被移除.也即是数据会过期.过期的数据无需保留,这种情形适用于如机器生成的事件数据,日志和会话信息等等.本文主要描述TTL索引的使用. 一.TTL索引 创建方法 db.collection.createIndex(keys, options) options: expireAfterSeconds 指定多少秒或者包含日期值的数组 创建示例 db.e