拆分算法概述
支持的拆分算法概览
DDM是一个支持既分库又分表的数据库服务,目前DDM分库函数与分表函数的支持情况如下:
拆分函数 | 描述 | 能否用于分库 | 能否用于分表 |
|---|---|---|---|
MOD_HASH | 简单取模 | 是 | 是 |
MOD_HASH_CI | 简单取模(大小写不敏感) | 是 | 是 |
HASH | 计算CRC32值,再简单取模 | 是 | 是 |
RANGE | 按范围 | 是 | 否 |
RIGHT_SHIFT | 数值向右移 | 是 | 是 |
YYYYMM | 按年月哈希 | 是 | 是 |
YYYYDD | 按年日哈希 | 是 | 是 |
YYYYWEEK | 按年周哈希 | 是 | 是 |
MM | 按月份哈希 | 否 | 是 |
DD | 按日期哈希 | 否 | 是 |
MMDD | 按月日哈希 | 否 | 是 |
WEEK | 按星期哈希 | 否 | 是 |

- 分库的拆分键及分表的拆分键,均不支持为空。
- 在DDM中,一张逻辑表的拆分方式是由拆分函数(包括分片数目与路由算法)与拆分键(包括拆分键的MySQL数据类型)共同定义。
- 当一张逻辑表的分库拆分方式与分表拆分方式不一致时,如果SQL查询没有同时带上分库条件与分表条件,则DDM在查询过程会产生全分库扫描或全分表扫描的操作。
DDL拆分函数的数据类型
DDM 的拆分函数对各数据类型的支持情况有所不同,下表显示了DDM 拆分函数对各种数据类型的支持情况。
拆分算法 | TINYINT | SMALLINT | MEDIUMINT | INTEGER | INT | BIGINT | CHAR | VARCHAR | DATE | DATETIME | TIMESTAMP | OTHERS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
MOD_HASH | √ | √ | √ | √ | √ | √ | √ | √ | × | × | × | × |
MOD_HASH_CI | √ | √ | √ | √ | √ | √ | √ | √ | × | × | × | × |
HASH | √ | √ | √ | √ | √ | √ | √ | √ | × | × | × | × |
RANGE | √ | √ | √ | √ | √ | √ | × | × | × | × | × | × |
RIGHT_SHIFT | √ | √ | √ | √ | √ | √ | × | × | × | × | × | × |
YYYYMM | × | × | × | × | × | × | × | × | √ | √ | √ | × |
YYYYDD | × | × | × | × | × | × | × | × | √ | √ | √ | × |
YYYYWEEK | × | × | × | × | × | × | × | × | √ | √ | √ | × |
MM | × | × | × | × | × | × | × | × | √ | √ | √ | × |
DD | × | × | × | × | × | × | × | × | √ | √ | √ | × |
MMDD | × | × | × | × | × | × | × | × | √ | √ | √ | × |
WEEK | × | × | × | × | × | × | × | × | √ | √ | √ | × |

√表示支持,×表示不支持。
DDM的拆分函数创表语法
DDM兼容MySQL的创表语法,并新增加了partition_options的分库分表关键字。
CREATE TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
partition_options:
DBPARTITION BY
{{RANGE|HASH|MOD_HASH|RIGHT_SHIFT|YYYYMM|YYYYWEEK|YYYYDD}([column])}
[TBPARTITION BY
{{HASH|MOD_HASH|UNI_HASH|RIGHT_SHIFT|YYYYMM|YYYYWEEK|YYYYDD}(column)}
[TBPARTITIONS num]
] 
