日期:2014-05-16  浏览次数:20417 次

MongoDB索引学习

1.在使用索引之前

在MongoDB中所有的insert,update,delete操作过程中,

都会更新所有与collection相关的索引。

每个索引都会为单个写操作进行开销。

?

所以,必须确定一下,为了索引,写入的开销是值得的,也做好当前的索引确实被使用到。

?

和数据库一样,Mongodb每次查询只会选择一条索引进行检索。

如果查询条件出现$or,那么有可能会检索不同的索引

?

为了确保执行效率,保证你的索引能够全部放在内存里面。

?

2.单列索引

在MongoDB中,所有的collection都会默认存在一个索引_id,它是唯一切递增的,你不能删除它。

用户可以根据自己的需要添加更多的索引。

?

如下就是给name字段增加一个索引

?

db.friends.ensureIndex( { "name" : 1 } )

?

?

如果要给内嵌的文档对象添加索引,如下:

?

//数据对象
{"_id": ObjectId(...)
 "name": "John Doe"
 "address": {
        "street": "Main",
        "zipcode": "53511",
        "state": "WI"
        }
}

//内嵌document属相索引创建
db.people.ensureIndex( { "address.zipcode": 1 } )

//对整个内嵌的document上创建索引
db.people.ensureIndex( { "address": 1 } )

?

?

3.组合索引

当查询存在多个条件的时候,可以通过组合索引(compound index)来加速查询。

?

注意:你不可以在已经建立了hash索引的字段上面,构建组合索引,这样你会得到一个异常!

?

//数据结构
{
 "_id": ObjectId(...),
 "item": "Banana",
 "category": ["food", "produce", "grocery"],
 "location": "4th Street Store",
 "stock": 4,
 "type": "cases",
 "arrival": Date(...)
}

//创建组合索引
db.products.ensureIndex( { "item": 1, "stock": 1 } )

//组合索引有排序的,你可以通过配置升序或者降序来控制索引的存储
db.events.find().sort( { username: 1, date: -1 } )

?

?

对于组合索引,和数据库索引一样,是存在字段顺序的区别的。

当你创建了item 和stock 索引的时候,你查询item 也会用到该索引。但是,单独查询stock的时候,索引则失效。

?

4.Multikey Indexes多键值索引

当一个字段包含数组,Mongodb会把数组里面的每个值都加入到索引里面。

这种索引可以实现使用数组作为查询条件并返回结果。

Mongodb在创建索引的时候会自行进行判断,是否使用多键值索引。

?

限制:当你使用混合索引的时候,最多只能允许一个字段是数组字段。

?

5.地理索引

?

6.全文索引 Text Index

Mongodb提供全文索引,以支持检索collection中document里的字符串内容。

Text index可以支持string对象和string的数组array。

在使用全文索引的时候,需要使用 $text 查询符。

?

创建全文索引:

?

//创建一个简单的全文索引
db.reviews.ensureIndex( { comments: "text" } )

//给指定的字段创建全文索引
db.collection.ensureIndex(
                           {
                             subject: "text",
                             content: "text"
                           }
                         )

//为所有字段创建全文索引
//这表示为所有的string字段创建全文索引,并将这个索引命名为TextIndex
db.collection.ensureIndex(
                           { "$**": "text" },
                           { name: "TextIndex" }
                         )

?PS. 一个collection只能最多含有一个全文索引。

?

?

全文索引默认支持的语言:

http://docs.mongodb.org/manual/reference/text-search-languages/#text-search-languages

?

使用全文索引来查询数据:

//简单查询
db.articles.find( { $text: { $search: "coffee" } } )

//匹配任何一个单词
db.articles.find( { $text: { $search: "bake coffee cake" } } )

//匹配任何一个词组 phrases
db.articles.find( { $text: { $search: "\"coffee cake\"" } } )

//排除一个
db.articles.find( { $text: { $search: "bake coffee -cake" } } )

?详细:http://docs.mongodb.org/manual/reference/operator/query/text/#op._S_text

?

?

7.Hashed Index 哈希索引

哈希索引会维护一个条目,里面存放着被hash的字段。

与多键值索引不同,hash索引会将整个sub-document作为一个整体进行hash。

哈希索引可以用于等值查询,但是不适用于范围查询。

?

创建哈希索引:

db.active.ensureIndex( { a: "hashed" } )

?

8.索引属性

?

8.1 TTL索引

其实是对应TTL collection(Time to live)表,是Mongodb 2.2加入的一种临时表。

?

8.2Unique Index唯一索引

与数据库的索引一样,强制唯一的索引。

创建方式如下:

db.members.ensureIndex( { "user_id": 1 }, { unique: true } )

如果在组合索引上面使用唯一键。

那么Mongodb会强制组合出来的键值唯一。

?

唯一索引不适用于hash索引。

?

8.3稀疏索引/ 散列索引