PolarDB-X 1.0是一个支持既分库又分表的数据库服务。本文将介绍PolarDB-X 1.0拆分函数的相关信息。
拆分方式
在PolarDB-X 1.0中,一张逻辑表的拆分方式由拆分函数(包括分片数目与路由算法)与拆分键(包括拆分键的 MySQL 数据类型)共同定义。只有当PolarDB-X 1.0使用了相同的拆分函数和拆分键时,才会被认为分库与分表使用了相同的拆分方式。相同的拆分方式让PolarDB-X 1.0可以根据拆分键的值定位到唯一的物理分库和物理分表。当一张逻辑表的分库拆分方式与分表拆分方式不一致时,若SQL查询没有同时带上分库条件与分表条件,则PolarDB-X 1.0在查询过程会进行全分库扫描或全分表扫描操作。
拆分函数对分库、分表的支持情况
| 拆分函数 | 说明 | 是否支持用于分库 | 是否支持用于分表 | 
|---|---|---|---|
| HASH | 简单取模 | 是 | 是 | 
| STR_HASH | 截取字符串子串 | 是 | 是 | 
| UNI_HASH | 简单取模 | 是 | 是 | 
| RIGHT_SHIFT | 数值向右移 | 是 | 是 | 
| RANGE_HASH | 双拆分列哈希 | 是 | 是 | 
| MM | 按月份哈希 | 否 | 是 | 
| DD | 按日期哈希 | 否 | 是 | 
| WEEK | 按周哈希 | 否 | 是 | 
| MMDD | 按月日哈希 | 否 | 是 | 
| YYYYMM | 按年月哈希 | 是 | 是 | 
| YYYYWEEK | 按年周哈希 | 是 | 是 | 
| YYYYDD | 按年日哈希 | 是 | 是 | 
拆分函数对全局二级索引的支持情况
拆分函数对数据类型支持情况
| 拆分函数 | 数据类型 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | × | × | × | × | × | × | × | √ | √ | √ | × | 
拆分函数的语法说明
PolarDB-X 1.0兼容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]
        ]