拆分键即分库/分表字段,是在水平拆分过程中用于生成拆分规则的数据表字段。DRDS 根据拆分键的值将数据表水平拆分到每个 RDS 实例上的物理分库中。
数据表拆分的首要原则,就是要尽可能找到数据表中的数据在业务逻辑上的主体,并确定大部分(或核心的)数据库操作都是围绕这个主体的数据进行,然后可使用该主体对应的字段作为拆分键,进行分库分表。
业务逻辑上的主体,通常与业务的应用场景相关,下面的一些典型应用场景都有明确的业务逻辑主体,可用于拆分键:
- 面向用户的互联网应用,都是围绕用户维度来做各种操作,那么业务逻辑主体就是用户,可使用用户对应的字段作为拆分键;
- 侧重于卖家的电商应用,都是围绕卖家维度来进行各种操作,那么业务逻辑主体就是卖家,可使用卖家对应的字段作为拆分键;
- 游戏类的应用,是围绕玩家维度来做各种操作,那么业务逻辑主体就是玩家,可使用玩家对应的字段作为拆分键;
- 车联网方面的应用,则是基于车辆信息进行操作,那么业务逻辑主体就是车辆,可使用车辆对应的字段作为拆分键;
- 税务类的应用,主要是基于纳税人的信息来开展前台业务,那么业务逻辑主体就是纳税人,可使用纳税人对应的字段作为拆分键。
以此类推,其它类型的应用场景,大多也能找到合适的业务逻辑主体作为拆分键的选择。
例如,某面向卖家的电商应用,需要对下面的一张单表进行水平拆分:
CREATE TABLE sample_order (
id INT(11) NOT NULL,
sellerId INT(11) NOT NULL,
trade_id INT(11) NOT NULL,
buyer_id INT(11) NOT NULL,
buyer_nick VARCHAR(64) DEFAULT NULL,
PRIMARY KEY (id)
)
由于确定了业务逻辑主体为卖家,那么选择对应的字段 sellerId 作为拆分键,且只分库不分表,则分布式 DDL 建表语句为:
CREATE TABLE sample_order (
id INT(11) NOT NULL,
sellerId INT(11) NOT NULL,
trade_id INT(11) NOT NULL,
buyer_id INT(11) NOT NULL,
buyer_nick VARCHAR(64) DEFAULT NULL,
PRIMARY KEY (id)
) DBPARTITION BY HASH(sellerId)
如果确实找不到合适的业务逻辑主体作为拆分键,那么可以考虑下面的方法来选择拆分键:
根据数据分布和访问的均衡度来考虑拆分键,尽量将数据表中的数据相对均匀地分布在不同的物理分库/分表中,适用于大量分析型查询的应用场景(查询并发度大部分能维持为1);
按照数字(字符串)类型与时间类型字段相结合作为拆分键,进行分库和分表,适用于日志检索类的应用场景。
例如,某日志系统记录用户的所有操作,需要对下面的日志单表进行水平拆分:
CREATE TABLE user_log (
userId INT(11) NOT NULL,
name VARCHAR(64) NOT NULL,
operation VARCHAR(128) DEFAULT NULL,
actionDate DATE DEFAULT NULL
)
可以选择用户标识与时间字段相结合作为拆分键,并按照一周七天进行分表,则分布式 DDL 建表语句为:
CREATE TABLE user_log (
userId INT(11) NOT NULL,
name VARCHAR(64) NOT NULL,
operation VARCHAR(128) DEFAULT NULL,
actionDate DATE DEFAULT NULL
) DBPARTITION BY HASH(userId) TBPARTITION BY WEEK(actionDate) TBPARTITIONS 7
更多拆分键的选择和分表形式,请参考 DRDS DDL 语句。
注意:无论选择什么拆分键,采用何种拆分策略,都要注意拆分值是否存在热点的问题,尽量规避热点数据来选择拆分键。
- 分布式关系型数据库 DRDS
分布式关系型数据库服务(Distributed Relation... 查看详情
- 云数据库 RDS 版
阿里云关系型数据库(Relational Database Se... 查看详情
- 企业级分布式应用服务 EDAS
企业级分布式应用服务(Enterprise Distribute... 查看详情