全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
分布式关系型数据库 DRDS

如何选择拆分键

更新时间:2017-03-08 16:00:32

拆分键即分库/分表字段,是在水平拆分过程中用于生成拆分规则的数据表字段。DRDS 根据拆分键的值将数据表水平拆分到每个 RDS 实例上的物理分库中。

数据表拆分的首要原则,就是要尽可能找到数据表中的数据在业务逻辑上的主体,并确定大部分(或核心的)数据库操作都是围绕这个主体的数据进行,然后可使用该主体对应的字段作为拆分键,进行分库分表。

业务逻辑上的主体,通常与业务的应用场景相关,下面的一些典型应用场景都有明确的业务逻辑主体,可用于拆分键:

  • 面向用户的互联网应用,都是围绕用户维度来做各种操作,那么业务逻辑主体就是用户,可使用用户对应的字段作为拆分键;
  • 侧重于卖家的电商应用,都是围绕卖家维度来进行各种操作,那么业务逻辑主体就是卖家,可使用卖家对应的字段作为拆分键;
  • 游戏类的应用,是围绕玩家维度来做各种操作,那么业务逻辑主体就是玩家,可使用玩家对应的字段作为拆分键;
  • 车联网方面的应用,则是基于车辆信息进行操作,那么业务逻辑主体就是车辆,可使用车辆对应的字段作为拆分键;
  • 税务类的应用,主要是基于纳税人的信息来开展前台业务,那么业务逻辑主体就是纳税人,可使用纳税人对应的字段作为拆分键。

以此类推,其它类型的应用场景,大多也能找到合适的业务逻辑主体作为拆分键的选择。

例如,某面向卖家的电商应用,需要对下面的一张单表进行水平拆分:

  1. CREATE TABLE sample_order (
  2. id INT(11) NOT NULL,
  3. sellerId INT(11) NOT NULL,
  4. trade_id INT(11) NOT NULL,
  5. buyer_id INT(11) NOT NULL,
  6. buyer_nick VARCHAR(64) DEFAULT NULL,
  7. PRIMARY KEY (id)
  8. )

由于确定了业务逻辑主体为卖家,那么选择对应的字段 sellerId 作为拆分键,且只分库不分表,则分布式 DDL 建表语句为:

  1. CREATE TABLE sample_order (
  2. id INT(11) NOT NULL,
  3. sellerId INT(11) NOT NULL,
  4. trade_id INT(11) NOT NULL,
  5. buyer_id INT(11) NOT NULL,
  6. buyer_nick VARCHAR(64) DEFAULT NULL,
  7. PRIMARY KEY (id)
  8. ) DBPARTITION BY HASH(sellerId)

如果确实找不到合适的业务逻辑主体作为拆分键,那么可以考虑下面的方法来选择拆分键:

  • 根据数据分布和访问的均衡度来考虑拆分键,尽量将数据表中的数据相对均匀地分布在不同的物理分库/分表中,适用于大量分析型查询的应用场景(查询并发度大部分能维持为1);

  • 按照数字(字符串)类型与时间类型字段相结合作为拆分键,进行分库和分表,适用于日志检索类的应用场景。

例如,某日志系统记录用户的所有操作,需要对下面的日志单表进行水平拆分:

  1. CREATE TABLE user_log (
  2. userId INT(11) NOT NULL,
  3. name VARCHAR(64) NOT NULL,
  4. operation VARCHAR(128) DEFAULT NULL,
  5. actionDate DATE DEFAULT NULL
  6. )

可以选择用户标识与时间字段相结合作为拆分键,并按照一周七天进行分表,则分布式 DDL 建表语句为:

  1. CREATE TABLE user_log (
  2. userId INT(11) NOT NULL,
  3. name VARCHAR(64) NOT NULL,
  4. operation VARCHAR(128) DEFAULT NULL,
  5. actionDate DATE DEFAULT NULL
  6. ) DBPARTITION BY HASH(userId) TBPARTITION BY WEEK(actionDate) TBPARTITIONS 7

更多拆分键的选择和分表形式,请参考 DRDS DDL 语句

注意:无论选择什么拆分键,采用何种拆分策略,都要注意拆分值是否存在热点的问题,尽量规避热点数据来选择拆分键。

本文导读目录