码迷,mamicode.com
首页 > 数据库 > 详细

【四】MongoDB索引管理

时间:2015-12-14 01:12:48      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

一、索引介绍

在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)介绍:

ParameterTypeDescription
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 textgeospatial, 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.
  • _id字段上索引:当一个集合被创建时,默认的会在_id字段上创建一个升序唯一索引,这个索引是不能被删除的。考虑到_id字段是一个集合的主键,所以对于集合中每个文档都应该有一个唯一的_id字段,在该字段中,你能存储任意的唯一的值。_id字段默认的值是ObjectId,它是在插入文档时被自动生成。在分片集合环境中,如果你没有指定_id字段为shard key,那么你的应用程序必须确保_id字段值得唯一性,否则会报错。常用的做法是:通过自动生成ObjectId标准值解决。
  • 内嵌字段索引:在内嵌文档的任意字段上,你也可以创建索引,就如同在文档的一级字段上创建一样。不过,需要说明的是,在内嵌字段上创建索引和在内嵌文档上创建索引是有区别的,前者通过点号的方式访问内嵌文档中的字段名。请看下面的例子:
> 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)复合索引

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【四】MongoDB索引管理

标签:

原文地址:http://www.cnblogs.com/mysql-dba/p/5043937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!