mongodb的索引
索引简介
如果没有索引,MongoDB必须执行集合扫描,即扫描集合中每个文档,以此匹配查询语句。
如果存在适当的索引,MongoDB可以使用该索引来限制必须检查的文档数。
索引在Mongo中是B-tree数据结构。索引存储特定字段或字段集的值,按字段的值排序。索引条目的顺序支持高效的相等匹配和基于范围的查询操作。
在创建集合期间,mongo在_id字段上创建唯一索引,防止客户端插入两个具有相同值的文档。
不同的客户端创建索引的方式,比如java sync客户端:
//在'name'字段上创建降序索引
collection.createIndex(Indexes.descending("name"));
需要注意的是,该方法仅在不存在相同的索引时才会创建索引。
索引的默认名称是索引键的串联,以及每个键在索引中的方向(1或-1)使用下划线作为分隔符。同时可以使用自定义名称创建索引。创建索引后,不能重命名索引,必须删除并重新创建具有新名称的索引。
索引类型
单字段索引
顾明思意是对文档中单个字段建立索引。同样的,对应嵌套字段,已可以对其建了单字段索引:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
//对location.state字段建立索引
db.records.createIndex( { "location.state": 1 } )
还可以对嵌套文档建立索引:
db.records.createIndex( { location: 1 } )
在嵌入式文档上执行相等匹配时,字段顺序事项和嵌入文档必须完全匹配。
复合索引
单个索引包括多个字段的引用。MongoDB强制联合索引限制为32字段。创建索引的语句:
db.products.createIndex( { "item": 1, "stock": 1 } )
复合索引中字段的出现的顺序很重要。类似mysql的最左前缀匹配:
db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )
同样指定字段索引顺序也是比较重要的。
db.events.createIndex( { "username" : 1, "date" : -1 } )
如果按照上面的方式创建索引,索引则不支持按下方式的排序:
db.events.find().sort( { username: 1, date: 1 } )
里面需要注意的一点是对于mongo3.4后的新特性collation](https://blog.csdn.net/u013066244/article/details/79260649)排序规则,如果指定了非默认的排序规则,则需要指定collation来使用索引,否则不能使用。下面给出实例:
//集合myColl在一个字符串字段类别上有一个索引,拼写语言为 "fr"。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
下面的情况可以是有索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
如果按照下面的查询方式,使用默认的二进制排序规则,则不能使用索引:
db.myColl.find( { category: "cafe" } )
更多的内容可以查看官网说明sort-results-with-indexes。
参考文档:
https://mongoing.com/archives/3912