DRDS是一个支持既分库又分表的数据库服务。本文将介绍DRDS拆分函数的相关信息。

拆分方式

DRDS中,一张逻辑表的拆分方式由拆分函数(包括分片数目与路由算法)与拆分键(包括拆分键的 MySQL 数据类型)共同定义。只有当DRDS使用了相同的拆分函数和拆分键时,才会被认为分库与分表使用了相同的拆分方式。相同的拆分方式让DRDS可以根据拆分键的值定位到唯一的物理分库和物理分表。当一张逻辑表的分库拆分方式与分表拆分方式不一致时,若SQL查询没有同时带上分库条件与分表条件,则DRDS在查询过程会进行全分库扫描或全分表扫描操作。

拆分函数对分库、分表的支持情况

拆分函数 说明 是否支持用于分库 是否支持用于分表
HASH 简单取模
STR_HASH 截取字符串子串
UNI_HASH 简单取模
RIGHT_SHIFT 数值向右移
RANGE_HASH 双拆分列哈希
MM 按月份哈希
DD 按日期哈希
WEEK 按周哈希
MMDD 按月日哈希
YYYYMM 按年月哈希
YYYYWEEK 按年周哈希
YYYYDD 按年日哈希

拆分函数对全局二级索引的支持情况

  • DRDS支持全局二级索引,从数据存储的角度看,每个GSI对应一张用于保存索引数据的逻辑表,称为索引表。
  • DRDS还支持创建GSI时指定索引表的拆分方式,并且对拆分函数的支持范围与普通逻辑表相同,创建GSI的详细语法,请参见使用全局二级索引

拆分函数对数据类型支持情况

拆分函数 数据类型
INT BIGINT MEDIUMINT SMALLINT TINYINT VARCHAR CHAR DATE DATETIME TIMESTAMP 其他类型
HASH × × × ×
UNI_HASH × × × ×
RANGE_HASH × × × ×
RIGHT_SHIFT × × × × × ×
STR_HASH × × × × × × × × ×
MM × × × × × × × ×
DD × × × × × × × ×
WEEK × × × × × × × ×
MMDD × × × × × × × ×
YYYYMM × × × × × × × ×
YYYYWEEK × × × × × × × ×
YYYYDD × × × × × × × ×

拆分函数的语法说明

DRDS兼容MySQL的DDL表操作语法,并添加了drds_partition_options的分库分表关键字,具体操作语法如下所示:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [drds_partition_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [drds_partition_options]
    [partition_options]
    select_statement

drds_partition_options:
    DBPARTITION BY
        { {HASH|YYYYMM|YYYYWEEK|YYYYDD|...}([column])}
        [TBPARTITION BY
            { {HASH|MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|...}(column)}
          [TBPARTITIONS num]
        ]