标签:
一、索引介绍
在mongodb中,索引用来支持高效查询。如果没有索引,mongodb必须在整个集合中扫描每个文档来查找匹配的文档。但是如果建立合适的索引,mongodb就可以通过索引来限制检查的文档数量。
索引是一种特殊的数据结构,它存储着集合中小部分的数据集,这种数据结构很容易遍历。索引存储着指定的字段或字段集合,这些字段都是根据字段值排序的。排序的索引条目能够支持高效的等值匹配和基于范围的查询操作,此外,mongodb通过排序索引还能够返回排好序的结果集。
从根本上来说,mongodb的索引类似于其他关系型数据库的索引,它被定义在集合层面并支持任何字段或子域,它采用B-tree数据结构。
二、索引概念
1、索引类型
MongoDB提供多种不同类型的索引。对于某一文档或者内嵌文档,你能够在任意字段或者内嵌字段上创建索引。一般而言,你应该创建通用的面向用户的索引。通过这些索引,确保mongodb扫描最少最有可能匹配的文档。在mongodb的shell中,你能通过调用createIndex()方法创建一个索引。
1)单字段索引
对于集合中的文档,mongodb完全支持在任何字段上创建索引。默认地,任何集合的_id字段上都有一个索引,并且应用和用户还可以添加额外的索引来支持重要的查询和操作。mongodb既支持单字段索引也支持多个字段的复合索引,这里先介绍单字段索引,下面请看举例说明:
> db.friends.insert({"name" :"Alice","age":27}) #集合friends中的一个文档 WriteResult({ "nInserted" : 1 }) > db.friends.createIndex({"name" :1}) #在文档的name字段上建索引 { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
db.collection.createIndex(keys,options)介绍:
Parameter | Type | Description |
---|---|---|
keys | document |
A document that contains the field and value pairs where the field is the index key and the value describes the type of index for that field. For an ascending index on a field, specify a value of 1; for descending index, specify a value of -1. MongoDB supports several different index types including text, geospatial, and hashed indexes. See Index Types for more information. |
options | document | Optional. A document that contains a set of options that controls the creation of the index. See Optionsfor details. |
> db.people.insert( ... { ... name:"John Doe", ... address: { ... street: "Main", ... zipcode:"53511", ... state: "WI" ... } ... } ... ) WriteResult({ "nInserted" : 1 }) > db.people.createIndex({"address.zipcode":1}) #通过address.zipcode方法引用zipcode字段,注意需要加上双引号。
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> db.factories.insert( { metro: { city: "New York", state:"NY" }, name: "Giant Factory" }) WriteResult({ "nInserted" : 1 }) > db.factories.createIndex({metro:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
上面的metro字段是内嵌文档,包含内嵌字段city和state,所以创建方法同一级字段创建方法一样。
下面的查询能够用到该索引:
db.factories.find( { metro: { city: "New York", state: "NY" } } )
{ "_id" : ObjectId("56189565d8624fafa91cbbc1"), "metro" : { "city" : "New York", "state" : "NY" }, "name" : "Giant Factory" }
在内嵌文档进行等值匹配查询时,需要注意字段的顺序,例如下面的查询将匹配不到任何文档:
> db.factories.find( { metro: { state: "NY", city: "New York" } } )
>
>
2)复合索引
标签:
原文地址:http://www.cnblogs.com/mysql-dba/p/5043937.html