一,创建表
1、创建分库分表
假设使用HASH的拆分库算法。拆分表算法为MOD_HASH,例如:
CREATE TABLE tbpartition_tbl (
id int NOT NULL AUTO INCREMENT COMMENT '主键id',
name varchar (128),
PRIMARY KEY(1d)
)ENGINE-INNODB DEFAULT CHARSET-utf8 COLLATE-utf8_unicode_ci
DBPARTTTION BY HASH(id)
TBPARTITION BY mod_hash (name) tbpartitions 8;
2、分库不分表
假设使用HASH的拆分库算法,例如:
CREATE TABLE tbpartition_tbl (
id int NOT NULL AUTO INCREMENT COMMENT '主键id',
name varchar (128),
PRIMARY KEY(1d)
)ENGINE-INNODB DEFAULT CHARSET-utf8 COLLATE-utf8_unicode_ci
DBPARTTTION BY HASH(id)
3、广播表
在业务数据库中,存在一些数据量不大,更新频率低,但常常需要用来做关联查询的表。为了支持这类表与拆分表进行join操作,DDM设计了一类“广播表”,具有以下特点:
- 广播表在各个分片中数据一致。数据插入、更新与删除会实时在每一个分片中执行一次。
- 对广播表的查询,仅在一个分片中执行。
- 任何表都可以与广播表进行join操作。
- 使用广播Hint的前提是需要确保表的存在性
例如:
CREATE TABLE broadcast_tbl(
id int NOT NULL AUTO INCREMENT COMMENT '主键id',
name varchar (128),
PRIMARY KEY(1d)
)ENGINE-INNODB DEFAULT CHARSET-utf8 COLLATE-utf8_unicode_ci
BROADCAST:
4、单表
DDM管理控制台不提供单表创建操作,用户可以通过Mysql客户端或者应用程序连接到DDM实例后自行创建。如果一张表的数据,数据量预估在1000万条以下,且没有与其他拆分表关联查询的需求,建议将其设置为单表类型,存储再默认分片中。
例如:
CREATE TABLE single (
id int NOT NULL AUTO INCREMENT COMMENT '主键id',
name varchar (128),
PRIMARY KEY(1d)
);
二、拆分算法概述
DDM是一个支持既分库又分表的数据服务,目前DDM分库函数与分表函数支持情况如下:
拆分算法 | TINY INT | SM ALL INT | MED IUM INT | INT | BIG INT | CHAR | VAR CHAR | DATE | DATE TIME | TIME STAMP | OTHE RS |
---|---|---|---|---|---|---|---|---|---|---|---|
HASH | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ |
UNI_HASH | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ |
RIGHT_ SHIFT | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ |
YYYYDD | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ | ✔ | ✔ | ✘ |
YYYYWEEK | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ | ✔ | ✔ | ✘ |
YYYYMM | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ | ✔ | ✔ | ✘ |
拆分算法概览表
拆分函数 | 描述 | 能否用于分库 | 能否用于分表 |
---|---|---|---|
MOD_HASH | 简单取模 | 是 | 是 |
UNI_HASH | 简单取模 | 是 | 是 |
RIGHT_SHIFT | 数值向右移 | 是 | 是 |
YYYYMM | 按年月哈希 | 是 | 是 |
YYYYDD | 按日哈希 | 是 | 是 |
YYYYWEEK | 按周哈希 | 是 | 是 |
HASH | 简单取模 | 是 | 是 |
RANGE | 按范围 | 是 | 否 |
MM | 按月份哈希 | 否 | 是 |
DD | 按日期哈希 | f否 | 是 |
MMDD | 按月日哈希 | 否 | 是 |
WEEK | 按星期哈希 | 否 | 是 |
注意:
- 分库的拆分键及分表的拆分键,均不支持为空
- 在DDM中,一张逻辑表的拆分方式是由拆分函数(包括分片数目与路由算法)与拆分键(包括拆分键的MYSQL数据类型)共同定义的。
- 当一张逻辑表的分库拆分方式与分表拆分方式不一致时,若SQL查询没有同时带上分库条件与分表条件,则DDM在查询过程会产生全分库扫描或者全分表扫描的操作。
三、SQL大类限制
- 不支持临时表;
- 不支持外键、视图、游标、触发器及存储过程:
- 不支持用户自定义数据类型及自定义函数;
- 不支持“IF”,“WHILE” 等流程控制类语句:
- 不支持 BEGIN···END、LOOP.··END LOOP、REPEAT···UNTIL···END REPEAT.
- WHILE···DO···END WHILE 等复合语句。
- 拆分表和广播表不支持外键;
- 不支持修改分片字段(拆分键);
- 不支持 ALTER DATABASE Syntax;
- 不支持从另一张表创建新的拆分表、广播表;
- create table 不支持 generated column 语法;
- 不支持 ALTER 命令修改拆分键和全局序列字段:
- 不支持创建 TEMPORARY 类型的拆分表、广播表;
- 逻辑表名只允许字母(不区分大小写)数字以及下划线
- CREATE TABLE tbl name LIKE old tbl name 不支持:
- CREATE TABLE tbl name SELECT statement 不支持:
- 不支持 insert into on duplicate key update 更新拆分键值;
- 暂不支持跨 Schema 的 DDL,例如, CREATE TABLE db name.tbl name(.·);
- 使用 MySOL 关键字或保留字做表名、列名、索引名等标识符时,需要使用反引
- 号扩起来;
- 不支持 PARTITION 子句;
- 不支持 UPDATE 使用子查询:
- 不支持 INSERT DELAYED Syntax;
- 不支持 STRAIGHT JOIN 和 NATURALJOIN;
- 受限支持 跨分片 UPDATE 多表需要 join update 的表需要有 PK;
- 受限支持 跨分片 DELETE 多表中的数据,需要 Join delete 的表需要有 PK:
- 不支持 SOL 中对于变量的引用和操作,比如 SET @c=1, @d-@c+1; SELECT @c,ad
四、自定义命令
SHOW TOPOLOGY FROM TABLENAME 【查询表的物理拓扑】