MongoDB实战-如何选择分片键

   分片集群中良好的查询性能都依赖于正确选择分片键。分片键选择不好,应用程序就无法利用分片集群所提供的诸多优势。在这种情况下,插入和查询的性能都会显著下降。下决定时一定要严肃,一旦选择了分片键,就必须坚持选择,分片键是不可以修改的。要让分片键提供好的体验,部分源自了解怎样才算一个好的分片键。因为这不是很直观,所以先讲述一些低效的分片键。

1. 低效的分片键

     一些分片键的分布性很差,而另一些则导致无法充分利用局部性原理,还有一些可能会妨碍块的拆分。

(1) 分布性差

   BSON对象ID是每个MongoDB文档的默认主键。咋一看,一个与MongoDB核心如此接近的数据类型很有可能成为候选的分片键。然而,我们不能被表象蒙蔽。回想一下,所有对象ID中最重要的组成部分是时间戳,也就是说对象ID始终是升序的。遗憾的是,升序的值对分片键而言是很糟糕的。

    要了解升序分片键的问题,你要牢记分片是基于范围的。使用升序的分片键之后,所有最近插入的文档都会落到某个很小的连续范围内。用分片的术语来说,就是这些插入都会被路由到一个块里,也就是被路由到单个分片上。这实际上抵消了分片一个很大的好处:将插入的负载自动分布到不同的机器上。结论已经很清楚了,如果想让插入负载分布到多个分片上,就不能使用升序分片键,你需要某些随机性更强的东西。

(2) 缺乏局部性

   升序分片键有明确的方向,完全随机的分片键则根本没有方向。前者无法分散插入,后者则有可能是将插入分的太散。这点可能会违背你的直觉,因为分片的目的就是要分散读写操作。我们可以通过一个简单的思想实验对比做出说明。

    假设分片集合里的每个文档都包含一个MD5,而且MD5字段就是分片键。因为MD5的值会随着文档的不同随机变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值