mongodb索引整理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值