拆分算法概述
支持的拆分算法概览
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] ]