> 데이터 베이스 > MySQL 튜토리얼 > MongoDB初探-细说索引

MongoDB初探-细说索引

WBOY
풀어 주다: 2016-06-07 15:29:26
원래의
1177명이 탐색했습니다.

一、索引操作 索引是为了优化查询速度而生,MongoDB的索引和其他关系型数据库,比如MySQL,Oracle等的索引几乎相同,对于它们的索引优化经验同样适用于MongoDB。 1、创建索引 MongoDB中建立索引是通过ensureIndex操作完成的。下面测试了在使用索引和不使用索

一、索引操作

索引是为了优化查询速度而生,MongoDB的索引和其他关系型数据库,比如MySQL,Oracle等的索引几乎相同,对于它们的索引优化经验同样适用于MongoDB。

1、创建索引

MongoDB中建立索引是通过ensureIndex操作完成的。下面测试了在使用索引和不使用索引下的性能差别,使用explain函数进行查询性能分析。

插入测试数据:

\

不使用索引的查询:喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140324/2014032409104154.jpg" alt="\">

使用索引的查询:

\

由以上测试可见,使用恰当的索引查找可以大大优化查询效率。

2、删除索引

\

索引的元信息存储在每个数据库的system.indexes集合中,该集合为保留集合,不能对其插入或删除文档。
操作只能通过ensureIndex或dropIndexes进行。

二、唯一索引

唯一索引可以确保集合的每一个文档的指定键都有唯一值。MongoDB建立唯一索引的方式如下:

db.person.ensureIndex({"name":1},{"unique":true})
로그인 후 복사
\

如果没有对应的键,索引会将其作为null存储。所以,如果对某个键建立了唯一索引,但插入了多个缺少该索引键的文档,则由于文档包含null值而导致插入失败。

三、组合索引

通过为ensureIndex的第一个参数传入多个键值的文档来实现组合索引的建立。组合索引适用于对多条件查询的优化上,一般来说,如果索引包含N个键,则对于前几个键的查询都会有帮助。比如有个索引{"a":1,"b":1,"c":1,...,"z":1},实际上是有了{"a":1},{"a":1,"b":1},{"a":1,"b":1,"c":1}等的索引,但使用{"b":1},{"a":1,"c":1}等索引的查询则不会被优化。
\

四、地理空间索引

MongoDB的地理空间索引用于处理平面坐标的查询,对于查找离当前位置最近的N个场所非常适用,在LBS应用中经常使用。

1、创建空间索引

db.map.ensureIndex({"gps":"2d"})
로그인 후 복사
"gps"键的值必须是某种形式的一对值:一个包含两个元素的数组或是包含两个键(键名随意)的内嵌文档,如下所示:
{"gps":[0,100]}
{"gps":{"x":0,"y":30}}
{"gps":{"latitude":0,"longitude":100}}
로그인 후 복사
默认情况下,地理空间索引假设值的范围是-180~180,这对于处理经纬度非常方便,也可以设置其范围:
db.map.ensureIndex({"gps":"2d"},{"min":-360,"max":360})
로그인 후 복사
2、查找

通过find函数查找:

将按照离坐标点(40,80)由近及远的方式将map集合的前5个文档返回。

db.map.find({"gps":{"$near":[40,80]}}).limit(5)
로그인 후 복사

通过数据库命令查找:

db.runCommand({geoNear:"map",near:[40,80],num:5});
로그인 후 복사
geoNear和使用$near的find普通查找类似,不过geoNear还会返回每个文档到查询点的距离。该距离以插入数据为单位,比如按照经纬度的角度插入,那距离就是经纬度。

具体其他空间索引的查找请参考MongoDB官方文档关于索引的介绍。

五、总结

对于索引的使用,要建立合适的索引,可以使用explain查看当前索引的效果。如果索引不适合当前业务需求的话,就要修改或删除,以免不必要或不恰当的索引对数据库操作产生影响。毕竟索引需要消耗内存和文件存储。对于索引要实时维护,不要索引每一个键。

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿