
# 拆分算法概述
#### 支持的拆分算法概览
DDM是一个支持既分库又分表的数据库服务，目前DDM分库函数与分表函数的支持情况如下：
表1拆分算法概览表 
| **拆分函数**    | **描述**         | **能否用于分库** | **能否用于分表** |
|:---|:---|:---|:---|
| MOD_HASH    | 简单取模           | 是          | 是          |
| MOD_HASH_CI | 简单取模（大小写不敏感）   | 是          | 是          |
| HASH        | 计算CRC32值，再简单取模 | 是          | 是          |
| RANGE       | 按范围            | 是          | 否          |
| RIGHT_SHIFT | 数值向右移          | 是          | 是          |
| YYYYMM      | 按年月哈希          | 是          | 是          |
| YYYYDD      | 按年日哈希          | 是          | 是          |
| YYYYWEEK    | 按年周哈希          | 是          | 是          |
| MM          | 按月份哈希          | 否          | 是          |
| DD          | 按日期哈希          | 否          | 是          |
| MMDD        | 按月日哈希          | 否          | 是          |
| WEEK        | 按星期哈希          | 否          | 是          |
   
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
- 分库的拆分键及分表的拆分键，均不支持为空。
- 在DDM中，一张逻辑表的拆分方式是由拆分函数（包括分片数目与路由算法）与拆分键（包括拆分键的MySQL数据类型）共同定义。
- 当一张逻辑表的分库拆分方式与分表拆分方式不一致时，如果SQL查询没有同时带上分库条件与分表条件，则DDM在查询过程会产生全分库扫描或全分表扫描的操作。
 
#### DDL拆分函数的数据类型
DDM 的拆分函数对各数据类型的支持情况有所不同，下表显示了DDM 拆分函数对各种数据类型的支持情况。
表2DDM 拆分函数对各种数据类型的支持情况 
| **拆分算法**    | **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        | ×           | ×            | ×             | ×           | ×       | ×          | ×        | ×           | √        | √            | √             | ×          |
   
![](https://support.huaweicloud.com/usermanual-ddm/public_sys-resources/note_3.0-zh-cn.png)
√表示支持，×表示不支持。
#### 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]
      ]
```
