加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 服务器 > 系统 > 正文

MongoDB范围片键和哈希片键有什么不一样?

发布时间:2022-04-22 10:20:15 所属栏目:系统 来源:互联网
导读:这篇文章给大家介绍MongoDB片键,主要介绍范围片键和哈希片键以及两者的不同,对大家学习和理解MongoDB有一定的参考价值,感兴趣的朋友就继续往下看吧。 01 片键 MongoDB的片键决定了集合中存储的数据在集合中的分布情况,具体的方法是使用片键值的范围来对
     这篇文章给大家介绍MongoDB片键,主要介绍范围片键和哈希片键以及两者的不同,对大家学习和理解MongoDB有一定的参考价值,感兴趣的朋友就继续往下看吧。
01 片键
      MongoDB的片键决定了集合中存储的数据在集合中的分布情况,具体的方法是使用片键值的范围来对集合中的数据进行分区。举个例子:
 
假如我们以年龄age来作为片键,那么age的范围理论上是0~80,此时,MongoDB会为我们定义age的四个范围区间,他们分别是:0~20,20~40,40~60,60~80,每个范围都是一个chunk,这样我们写入数据之后,数据里面的数据块就有:
 
chunk1:  age  0~20
 
chunk2:  age  20~40   
 
chunk3:age  40~60
 
chunk4:age  60~80
 
      需要注意的是,在一个集合中,被选为片键的这个字段上必须有一个支持片键的索引,或者是必须有一个以这个字段开头的联合索引。通常情况下,我们给字段添加的索引,最常见的是普通索引或者哈希索引,普通的索引字段如果作为片键,那么这个片键我们称为范围片键;哈希索引字段如果作为片键,那么这个片键我们称为哈希片键。下面我们来看二者的不同之处:
 
02 范围片键(递增片键)
      范围片键,顾名思义,就是将数据根据片键划分到连续的范围里面,在这个模型中,那些值"相似"的文档可能位于同一个片中。例如下面这样:
 
      这中分片方式是MongoDB默认的分片方式,它有好处也有坏处。
 
      好处:
 
      可以高效的读取连续范围内的目标文档。如果你使用范围查询,则可以比较快速的拿到所有的结果值。因为数据所在的数据chunk比较少。
 
      坏处:
 
      如果我们写入的数据都几种在某一个分片区间,那么读写性能都可能因为片键划分不均匀而降低。(例如下图中,数据的基数大部分在20~maxKey,则大部分都在chunk C的位置,本身分布不均匀),Chunk C的写入压力将会增大。
 
03 哈希片键
      哈希片键使用哈希索引在共享集群中对数据进行分区。哈希索引计算单个字段的哈希值作为索引值,该值用作片键(注意,这里并不是字段本身的值,而是hash之后的值)。
 
使用哈希索引,我们写入数据之后,对应写入数据块的图示可能如下:
  
      从图中我们看出来,虽然我们输入的x值比较接近,分别是25、26、27,但是,经过hash函数之后,他们所在的数据块序号可能差距很远。哈希分片在分片集群中提供了更均匀的数据分布,集合中那些具有近似值的文档,可能会被分到不同的块上,mongos更有可能执行广播操作来完成给定的范围查询。哈希值得计算,是由MongoDB来负责的,不是应用程序负责的。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读