mongodb 基本原理:索引(Indexes)

mongodb 使用索引支持高效的查询,没有索引就必须要扫描整个数据集。

索引是以一种可高效遍历数据的形式(B树)存储的结构,存放着一个或多个字段值,并且按值排序。索引的这种排序支持高效的精确查询或者范围查询,根据索引的排序返回排好序的数据。

以下是使用索引查询病排序的图示:

 

默认的  _id  索引

mongodb 在 _id 字段上创建唯一索引,这个索引不能删除。

注意:在分片集群中,若_id 不作为shardkey,则必须在应用中保证其唯一性。通常可以用自动生成的  ObjectId

 

索引的创建

 db.collection.createIndex()

db.collection.createIndex( { name: -1 } )

在name字段上创建一个单key 降序索引

 

索引名称

默认的索引名称是排序的key的拼接,外加每个key后拼接其排序方式(升序、降序对应1、-1)

如 :{ item : 1, quantity: -1 } 的索引名称是: item_1_quantity_-1

自定义索引名称可以使用:

db.products.createIndex(
  { item: 1, quantity: -1 } ,
  { name: "query for inventory" }
)

可以用  db.collection.getIndexes() 查看索引. 索引一旦创建不可以重命名,必须通过删除索引再重建来重命名。

 

索引类型

单一字段索引

对单一key的索引而言,顺序不太重要,因为mongodb可以逆序遍历。

更多详见:

复合字段索引

这里的字段顺序就比较重要了,如:{userid: 1, score: -1 },先按 userid  升序排序,在每个 userid  内部,按 userid 降序

更多详见:

 

多字段索引

用于索引数组内容

当对一个数组字段添加索引时,mongodb为数组每个元素添加一个索引,例如:

更多详见:

更多索引类型:

  • Geospatial Index(地理坐标索引),详见 2d Index Internals 
  • Text Indexes(文本索引),详见:Text Indexes
  • Hashed Indexes(哈希索引),对字段值的哈希值做索引,可以更好的分散,但只支持精确匹配不支持范围查询。

 

索引的特性

  • 唯一性,索引字段的值不能重复
  • 部分索引(Partial Indexes):根据表达式过滤到的文档建立索引,更少的存储要求,减少了索引创建的性能损耗。是稀疏索引(sparse indexes )的超集,相比后者更建议使用部分索引。
  • 稀疏索引(Sparse Indexes):只索引包含该字段的文档
  • TTL Indexes:生存时间索引,mongodb会对超出时间的文档进行删除,适合日志类信息的管理
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

索引与文字校对(Indexes and Collation)

校对(Collation)用于指定字符串校验规则

使用这类索引时,查询也要指定相同的校验(collation)规则

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

指定了规则: locale "fr"

以下查询可以使用该索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

以下查询则不能用该索引:

db.myColl.find( { category: "cafe" } )

 

覆盖查询(Covered Queries)

当查询只涉及索引字段时,mongodb 可以直接从索引返回,而不需要扫描文档并导入内存(回表),这样比较高效

 

索引合并(Index Intersection)

索引合并是:index merge,Intersection 是一种方式

同一个表的多个索引扫描后进行合并

一个复合字段查询,索引a覆盖查询条件一部分,索引b覆盖另一部分,mongodb 使用 索引Intersection 实现查询

 

更多索引相关详见:

 

转自:Indexes

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值