全部产品
云市场

如何选择拆分键

更新时间:2019-05-22 09:26:17

拆分键即分库/分表字段,是水平拆分过程中用于生成拆分规则的数据表字段。DRDS 将拆分键值通过拆分函数计算得到一个计算结果,然后根据这个结果将数据分拆到 RDS 实例上。

数据表拆分的首要原则是尽可能找到数据所归属的业务逻辑实体,并确定大部分(或核心的)SQL 操作或者具备一定并发的 SQL 都是围绕这个实体进行,然后可使用该实体对应的字段作为拆分键。

业务逻辑实体通常与应用场景相关,下面的一些典型应用场景都有明确的业务逻辑实体,其标识型字段可用来做拆分键:

  • 面向用户的互联网应用,围绕用户维度来做各种操作,那么业务逻辑实体就是用户,相关联的表便可使用用户 id 作为拆分键
  • 侧重于卖家的电商应用,围绕卖家维度来做各种操作,那么业务逻辑实体就是卖家,可使用卖家 id 作为拆分键
  • 游戏类在线应用,围绕玩家维度来做各种操作,那么业务逻辑实体就是玩家,可使用玩家 id 作为拆分键
  • 车联网在线应用,围绕车辆维度来做各种操作,那么业务逻辑实体就是车辆,可使用车辆 id 作为拆分键
  • 税务类在线应用,围绕纳税人来进行前台业务,那么业务逻辑实体就是纳税人,可使用纳税人 id 作为拆分键

以此类推,其它应用场景也能找到合适的业务逻辑实体。

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

  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)

如果确实找不到合适的业务逻辑实体作为拆分键,特别是传统企业级应用,那么可以考虑下面的方法来选择拆分键:

  • 根据数据分布和访问的均衡度来考虑拆分键,尽量将数据表中的数据相对均匀地分布在不同分表中,DRDS 后续推出的全局强一致二级索引和 Parallel Query 能够改善在此场景下 SQL 并发度和响应时间

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

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

  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 Create Table 文档和 DRDS 拆分函数 文档