MongoDB基础(三):MongoDB的索引

介绍

MongoDB和其他DBMS一样,也支持索引机制,可以通过索引优化查询,避免全表扫描。MongoDB支持多种索引。

  • _id主键索引
  • 普通索引
  • 组合索引
  • 唯一索引
  • 多键索引
  • 地理空间索引
  • 文本索引
  • 哈希索引
  • 稀疏索引
  • TTL索引
  • ......

从以上可以看出,MongoDB与MySQL类似,MySQL支持的索引MongoDB也几乎都支持,而且MongoDB索引同样是使用b+树存储。不过与MySQL不同的时,MongoDB建立索引的时候,可以指定正序还是逆序。

_id主键索引

这是MongoDB的默认索引,每个文档插入集合时,都会自动生成一个_id字段,MongoDB在该字段上创建唯一索引。与MySQL的主键概念类似,插入文档时可以手动指定,也可以由MongoDB的ObjectID自动生成,如果手动指定重复,则插入失败。

普通索引

MongoDB为集合文档上的任意一个字段都可以创建索引,可以指定升序或者降序。包括

  • 文档中的某个字段创建索引
  • 文档中的嵌套文档的某个字段创建索引
  • 文档中的嵌套文档整体创建索引

组合索引

与MyQSL类似,MongoDB也支持组合索引,可以对文档的多个字段创建一个组合索引,多个字段的顺序很重要,底层存储按照前后顺序排列,同样满足最左前缀匹配原则。

例如创建userId-name两个字段的索引,可以匹配userId的查询,也可以匹配userId-name的查询,但无法匹配name或者name-userId的查询。

创建组合索引时同样可以手动指定按照升序还是降序排列,在普通索引时,升序还是降序不重要,因为MongoDB可以在任一方向遍历索引,而组合索引字段的升序还是降序会影响排序是否走索引。

例如创建name升序-age降序的组合索引,当遇到name升序-age降序的查询和name降序-age升序的查询都可以走索引,而遇到name升序-age升序或者name降序-age降序的查询时则无法走索引。即查询的每个字段顺序必须要与索引排序一致或都相反,这样MongoDB会选择从正向遍历索引或者反向遍历索引从而走索引查询。

多键索引

为保存数组值的字段建立索引,MongoDB为数组中的每个元素创建一个索引。这些多键索引支持对数组字段的有效查询。可以在既包含标量值(例如字符串,数字)又包含嵌套文档的数组上构造多键索引。

需要注意的是分片键不能是多键索引,Hash索引也不能多键,多键索引也不能对数组覆盖查询。

地理空间索引

现在大多数软件开发都与地理位置有关,例如美团,滴滴的定位等LBS相关项目,一般存储每个地点的经纬度的坐标,如果想要查询周围场所,则需要建立索引提高效率。

MongoDB在1.4版本引入了地理空间索引。MongoDB支持两种地理空间索引:

  • 返回平面结果的2d索引
  • 返回球面结果的2dsphere索引

文本索引

MongoDB也提供了一种text索引类型,类似于MySQL的全文索引,该类型支持在集合中搜索字符串内容。

哈希索引

相比于B+树logn的查询时间复杂度,哈希的O(1)时间复杂度更适合查询,而由于Hash不适合范围查询的特性,导致目前主流存储数据结构采用b+树。但与MqSQL类似,MongoDB同样提供了哈希索引。

MongoDB为了支持基于散列的分片,MongoDB提供了一种散列索引类型,该索引类型对字段值的散列进行索引。这些索引在其范围内具有更随机的值分布,但仅支持相等匹配,而不能支持基于范围的查询。

部分索引

部分索引仅索引集合中符合指定过滤器表达式的文档。通过索引集合中文档的子集,部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本。

创建部分索引时,还需要指定过滤表达式,只为符合条件的数据创建索引,可以有效减少冷数据索引的存储空间和维护。

稀疏索引

索引的稀疏属性可确保索引仅包含具有索引字段的文档的条目。索引会跳过没有索引字段的文档。

您可以将稀疏索引选项与唯一索引选项结合使用,以防止插入索引字段具有重复值的文档,并跳过缺少索引字段的索引文档。

TTL索引

TTL索引是MongoDB可以使用的特殊索引,可以在一定时间后自动从集合中删除文档。对于某些类型的信息(例如机器生成的事件数据,日志和会话信息),它们仅需要在数据库中保留有限的时间,这是理想的选择。

覆盖索引

与MySQL一样,MongoDB同样支持覆盖索引,即查询结果被索引覆盖,查询速度就会提升很多,因为这样数据可以直接从索引拿,不用再次回表查询。

索引交集

索引交集是MongoDB在2.6版的新功能。

MongoDB可以使用索引交集来完成查询。对于指定复合查询条件的查询,如果一个索引可以满足查询条件的一部分,而另一个索引可以满足查询条件的另一部分,则MongoDB可以使用两个索引的交集来满足查询。使用复合索引还是使用索引交集是否更有效取决于特定查询和系统。

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值