MonogDB-索引(一)概述(一)

2014-11-24 17:10:05 · 作者: · 浏览: 2
一 索引简介
索引是一种特殊的数据结构,只保存一个集合的小部分数据,方便遍历。它保存了一个指定域的值或者几个域的值,而且他们是排过序的。
在MongoDB 数据库中存储的索引数据信息基本上和其他的数据库系统是相同的。MongoDB 在集合层次上来定义索引,可以在集合的任意字段上建立索引,也可以在子文档字段上建立索引。
索引的建立应该是面向用户查询的,使用索引保证只需要查看少量的数据集,使用ensureIndex()来建立索引。
MongoDB中使用B-Tree类管理索引,可以有效的支持范围查询和匹配查询,在集合内部文档可以按照升序或者降序来排列文档,MongoDB可以改变排序的方式(升序或者降序),对于单字段的索引,索引的升序和降序是可以改变的,但是对于复合索引,如果改变升序或者降序将对结果产生很大的影响。

\
注:MongoDB使用索引返回的文档会自动按照主键进行排序,这样就不用再使用sZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcnS9+NDQxcXQ8qGjCgo8YnI+CgoKPGltZyBzcmM9"https://www.cppentry.com/upload_files/article/57/1_0blyx__.jpg" alt="\">

如果返回结果中只包含索引键的话, MongoDB会直接从索引中来返回结果,这样就不用再扫描所有文档,也就不用将文档加入内存中,这样只包含索引字段的查询是非常的高效的。索引也可适用于管道操作符。例如下图所示:

\

二 索引类型

a. _id字段 默认情况下,所有MongoDB集合都有一个以_id字段命名的索引,一个12个字节的唯一标识符。如果用户没有给_id字段指定值的话,MongoDB会使用自动创建一个ObjectID对象,作为_id的值。_id索引是唯一的,用户不可以插入两条_id字段相同的文档。
注意: 1._id字段是不能删除的 2.在分片集群中,如果你不选择_id作为片键的话,你的程序必须确保能够产生一个唯一的_id值,否则会产生错误。在大多数情况下,都会使用ObjectID作为_id的值。
b.单个字段索引 可以在文档的任何一个字段上来建立索引,默认情况下_id字会作为索引 \

例如:下面是friends集合中的一个文档:
     {
        "_id" : ObjectID(...),
        "name" : "Alice"
        "age" : 27 
     }
将普通字段作为索引 db.friends.ensureIndex( { "name" : 1 } )


将子文档的字段作为索引 { "_id": ObjectId(…) "name": "John Doe” "address": { "street": “Main" "zipcode": 53511 "state": “WI” } } db.people.ensureIndex( { "address.zipcode": 1 } )


将子文档作为索引
     {
       _id: ObjectId("523cba3c73a8049bcdbf6007”),
        metro: { city: "New York", state: "NY”}, 
        name: "Giant Factory”
     }
db.factories.ensureIndex( { metro: 1 } )

注意:1.在子文档的字段上创建索引和子文档索引是不一样的,例如: 下面的查询会用到metro索引 db.factories.find( { metro: { city: "New York", state: "NY" } } ) 使用上面的查询会返回整个文档。 2.在进行子文档查询的时候,字段顺序是比较重要的,例如,如果按照下面的方式来写查询语句是不会使用到先前创建的索引,因为它和我们文档中字段的顺序不一致。 db.factories.find( { metro : { state : "NY" , city : "New York" } } )

c.复合索引 MongoDB 允许在多个字段上建立索引。在创建复合索引中,字段出现的先后顺序会影响到查询。比如说如果有一个复合索引:{ userid: 1, score: -1 } ,集合内的文档首先按照userid进行排序,对于每一个相同userid会按照score排序。 \
     {
      "_id": ObjectId(...)
      "item": "Banana"
      "category": ["food", "produce", "grocery"]
      "location": "4th Street Store"
      "stock": 4
      "type": cases
      "arrival": Date(...) 
}
例如,我们可以在经常查询的item和stock字段上建立复合索引:
db.products.ensureIndex( { "item": 1, "stock": 1 } )

注意: 1.复合字段最多只能包含31个字段 2.复合索引的字段上是不能包含哈希索引字段的。 3.在建立复合索引的时候,字段的顺序是很重要的,例如在上面的例子中,文档首先会按照第一个字段的值来进行排序,对于每一个相同的值,再按照第二个字段给定的值进行排序。
对于复合索引,MongoDB支持前缀式的查询,例如:复合索引字段为 :{ a: 1, b: 1, c: 1 },当我们按照以下字段查询的时候,都会用到上面建立的索引: { a: 1 }和 { a: 1, b: 1 }
对于 { "item": 1, "location": 1, "stock": 1 } MongoDB 支持下面的查询方法
{“item”:1} {“item”:1,”location”:1} {“item”:1,”location”:1,”stock”:1}
不支持下面的查询 {“stock”:1} {“location”:1,”stock”:1}
索引顺序(升序降序索引)
db.events.find().sort( { username: 1, date: -1 } )
username将按照升序排序,而date将按照降序排序
d.多重(多路径)索引
MongoDB 使用多重索引来对数组元素排序。如果我们在一个拥有数组值的字段上建立索引的话,MongoDB会独立的为数组内的元素创建索引,多重索引可以在数组中查询某个特定的元素的时候或者数组的子集的时候可以加快查询。 \ {
       "_id" : ObjectId("..."),
       "name" : "Warm Weather",
       "author" : "Steve",
       "tags" : [ "weather", "hot", "record", "april" ]
} 在数组tags1上建立索引 { tags: 1}
注意: 1.片键不能为多重索引
2.你不需要显式的的创建索引,Mongodb 会根据需要自动的创建多重索引 3.复合索引中可以包含多重路径索引,但是最多只能包含一个。比如我们可以在 下面的文档上: {a: [1, 2], b: 1} {a: 1, b: [1, 2]} 创建复合索引{ a: 1, b: 1 }是允许的。 但是如果在 {a: [1, 2], b: [1, 2]}这个文档上,是不能建立{a: 1, b: 1 }


e.地理位置坐标 地理位置坐标可以提高地理信息坐标信息的查询速度,MongoDB提供了两种索引类型:2d indexes和2sphere indexes。前者是基于平面几何来使用,后者