【MongoDB】shard 片键选择

选择片键需要慎重,因为一旦选定就无法更改了。

常用的有两种选择:

(1)升序片键,常见的比如_id,date,来自其他数据库的自增主键等。如果使用升序片键,那么数据物理上会是连续的,有利于基于范围的查询,因为数据库一次拿进来若干的数据块,由于是连续排列的,那么后续的数据就不需要再通过io拿新的块。但是升序键有个明显的问题是,数据只会插入到最大块里。最开始只有一个块,然后随着数据的插入,块会分裂为两块,一个是范围值较小的,一个是较大的,后续的数据因为是增序的,所以只会插入到较大快内,所以,每一次的分裂,都会导致数据值较小的块没有任何写入,所有的写入只会集中到最大块,这会降低写入性能。而且,由于其他块分裂以后没有写入请求,那么这些块的空间利用率不高。

(2)随机片键,可以使用MongoDB自带的hash key机制,这样,所有的写入请求都会被均衡的转发到各个数据块。解决了上面写入效率低的问题。但是基于范围的查询效率变低。因为数据不是按照片键值物理排放,这样相邻的数据值可能位于不同的数据块,这样需要更多的IO次数拿块到内存。


有一个比较好的方法结合上述两者的优点,也就是复合片键策略。

片键由两部分构成,第一部分是一个随机值,但是值的度比较少,与分片数目大致一样或者常数倍。第二部分是升序值。这样,每一条数据会根据第一部分做分发,分发以后每一个片内部是升序的,这样查找的时候,可以按照分片来查,每一个分片内部是升序的,效率会变高。

比如第一部分是{A,B,C}, 第二部分升序,那么片键可能是A1 B2 C3 A4 B5 C6 A10 B15 C20这样。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值