分片字段的选择,需涉及的因素很多,可大致分为以下几个方面:
1.数据结构
- 主键或唯一索引字段是否要包含如分片字段。很多数据库丛唯一性校验,是必须要求包含分片键在其中,否则无法完成校验工作。
- 索引字段对分片字段的选择上,没有直接影响。对于全局索引的,可考虑通过二级索引表的方式解决;对于普通索引,则可以在分片基础上做本地索引。
- 字段类型,选择适合分片的字段作为分片键。常见的分片类型包括有数字、日期、文本等。
2.数据特征 - 表规模,是是否使用分片的关键因素之一。表做了分片后,势必后造成一定的“功能退化”,如能采取其他方式缩小表的大小,尽量采用。可通过表的全生命周期规划,如常规的数据归档、压缩、转储、清理策略,减少数据量。此外,数据库内置的如表分区、垂直分表等策略也可以有效减小表的大小。
- 数据离散度,按某个字段或字段组合后,表的数据是否足够分散。数据分片的初衷就是减少表的规模,尽量做到数据打散是其根本原则之一。这里需要统计数据拆分后离散程度,尽量选择能充分打散的字段作为分片键。这里需注意,如果选择字段是带有业务特征,还要关注未来业务变化对它的影响。
3.访问特征 - 可变化性,选择相对固定、不再变化的字段作为分片键。虽然有些数据库也支持分片键的修改,但毕竟修改后会涉及数据移动,成本代价很高;还是优选不变的字段为好。
- 事务隔离,尽量选择按字段拆分后的数据,对数据的变化处理可集中在分片内解决。这样大量的业务变化是可以通过Local的事务完成,开销比全局的要小很多,效率也高。
- 关联字段,如后续此表与其他关联表经常联合使用,优先那些参与到关联操作的字段为佳。尽量是数据在关联后,能在本地完成Join的动作,减少数据 Shuffle或上移汇聚类的操作
4.其他因素 - 如涉及到多个字段作为分片键的话,还需考虑如字段顺序等问题。