07-选择分区方法
23.2.3 选择分区方法
对大型集合进行分片的下一步是,决定如何根据片键来分配文档。根据片键在分片服务器之间分配文档时,可使用两种方法。具体使用哪种方法取决于您选择的片键的类型。
- 基于范围的分片: 根据片键将数据集划分为不同的范围。这种方法非常适合用于数值型片键,例如,如果有一个商品集合,其中种商品都有1~1000000的商品ID,则可将商品划分为如下范围:1~250000、250001~500000等。
- 基于散列的分片: 使用一个散列函数,它通过对字段值进行计算来创建块。散列函数应确保即便文档的字段值非常接近,它们也将位于不同的分片中,这样才能确保均匀分布。
选择片键和分配方法时,确保文档在分片服务器间尽可能均匀地分布很重要,否则,将出现这样的情况:有些服务器不堪重负,而有些服务器比较清闲。
基于范围的分片的优点是易于定义和实现。另外,如果查询大多也是基于范围的,这种分片方式的性能将优于基于散列的分片。然而,基于范围的分片很难实现均匀分布,除非您预先拥有所有的数据且分片键的值不会发生变化。
基于散列的分片要求对数据有更深入的认识,但通常是最佳的分片方法,因为它可确保文档分布更均匀。
对集合启用分片时指定的索引决定了将使用哪种分区方法。如果指定的索引是基于值的,MongoDB将使用基于范围的分片。下面的索引导致根据文档的字段zip和name进行基于范围的分片:
db.myDB.myCollection.ensureIndex({"zip": 1, "name":1})
要使用基于散列的分片,需要将索引定义为散列索引,如下所示:
db.myDB.myCollection.ensureIndex({"name":"hash"})