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稀疏索引/ 散列索引