分类
- RANGE 分区
- 根据连续区间值切分数据
- LIST 分区
- 根据枚举值切分数据
- HASH 分区
- 对整数求模划分数据
- KEY 分区
- 对任何数据类型求模切分数据
注意点
和 mycat 切分规则没有关系
- 各分各的,mycat 区分集群,表分区区分存储位置
分区 key 和主键关系
- 分区 key 必须包含在 PRIMARY KEY 或者 UNIQUE KEY 中
单独的表分区创建语句无法存在
- 要么前面跟一个表定义
- 要么用
ALTER TABLE来给表创建分区
查看分区表信息
SELECTPARTITION_NAME, -- majorPARTITION_METHOD,PARTITION_EXPRESSION, -- majorPARTITION_DESCRIPTION,TABLE_ROWS, -- majorSUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSIONFROM information_schema.`PARTITIONS`WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME="<table_name>";
创建表分区
Range 分区
-
例子
按照主键范围分区
- 很少用
- 按照月份分区 ```sql CREATE TABLE t_range ( id INT UNSIGNED, name VARCHAR(200) NOT NULL, judge_id DATE UNSIGNED NOT NULL, — 分区 字段 PRIMARY KEY (id, judge_id) — 分区 key 必须包含在 PRIMARY KEY 或者 UNIQUE KEY 中 )
— 表分区 根据连续区间值切分数据 PARTITION BY RANGE(MONTH(birthday)) ( — 指定数据将要划分到指定位置 — 该位置必须让 mysql 具有 chown 权限 PARTITION part1 VALUES LESS THEN(6) DATA DIRECTORY=’/mnt/p0/data’, PARTITION part2 VALUES LESS THEN(12) DATA DIRECTORY=’/mnt/p1/data’ )
<a name="rYEAX"></a>### LIST 分区- 用于按需分区<a name="LU1fz"></a>#### 例子```sqlCREATE TABLE t_list (id INT UNSIGNED,name VARCHAR(200) NOT NULL,judge_id INT UNSIGNED NOT NULL, -- 枚举值分片字段PRIMARY KEY (id, judge_id) -- 分区 key 必须包含在 PRIMARY KEY 或者 UNIQUE KEY 中)-- 表分区 枚举值切分指定数据PARTITION BY LIST(judge_id) (-- 指定数据将要划分到指定位置-- 该位置必须让 mysql 具有 chown 权限PARTITION part1 VALUES IN (1,2)DATA DIRECTORY='/mnt/p0/data',PARTITION part2 VALUES IN (3,4)DATA DIRECTORY='/mnt/p1/data')
插入几条数据
查看对应硬盘是否有数据 ```shell [root@localhost p0]# tree . ├── data │ └── test │ └── t_list#P#part1.ibd └── lost+found
3 directories, 1 file
<a name="uAkJ8"></a>### HASH 分区- 用于均匀数据<a name="7Smgl"></a>#### 支持类型- 支持很多类型- 可以对整数,或者函数运算结果是整数的字段- 即只要 `HASH(<condition>)` 中只要 `condition` 为整数即可<a name="63Bv6"></a>#### 和 Mycat 的主键求模区别- 仅支持整数<a name="Bpn66"></a>#### 例子```sqlCREATE TABLE t_hash (id INT UNSIGNED,name VARCHAR(200) NOT NULL,judge_id INT UNSIGNED NOT NULL, -- hash 字段PRIMARY KEY(id, judge_id) -- 分区 key 必须包含在 PRIMARY KEY 或者 UNIQUE KEY 中)-- 表分区 对整数求模划分数据-- 后面 enum 是取模PARTITION BY HASH(judge_id) PARTITIONS 2(PARTITION p0DATA DIRECTORY="/mnt/p0/data",PARTITION p1DATA DIRECTORY="/mnt/p1/data")
KEY 分区
- 比 hash 更好的适应分区键
- 也可用于均匀字段
- 支持所有类型
— 表分区 对任何数据类型求模切分数据 PARTITION BY KEY (judge_id)( PARTITION p0 DATA DIRECTORY=”/mnt/p0/data”, PARTITION p1 DATA DIRECTORY=”/mnt/p1/data” )
---<a name="I47Jk"></a>## 管理表分区- 都是使用 `ALERT TABLE` 语句<a name="UaDVb"></a>### 创建```sqlALTER TABLE <表名> PARTITION BY <分区类型>(<分区字段or值>) [<额外选项>](PARTITION <自定义分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"],...)
添加
- db 会自动迁移分区数据
ALTER TABLE <表名> ADD PARTITION (PARTITION <自定义分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"],...)
切分和合并
- db 会自动迁移分区数据
切分
ALTER TABLE <表名> REORGANIZE PARTITION <老分区名> INTO (PARTITION <新分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"],...)
合并
ALTER TABLE <表名> REORGANIZE PARTITION <老分区名1>, ..., <老分区名n> INTO (PARTITION <新分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"],)
删除
删除数据
- 仅支持 RANGE 和 LIST 分区
- 会删除表空间和数据!
- 如果仅有一个表空间,将无法
DROP掉- 先删除表空间
- 再删除表
ALTER TABLE <表名> DROP PARTITION <分区名1>, ... <分区名n>;
仅删除表空间
- 仅剔除表空间,不会删除数据
ALTER TABLE <表名> REMOVE PARTITIONING ;
子分区
语句
-
创建
-- 方式一ALTER TABLE <表名> PARTITION BY <ANGE, LIST分区类型>(<分区字段or值>) [<额外选项>]-- 分区的子分区数量必须相同SUBPARTITION BY <HASH, KEY 分区类型>(<分区字段or值>) SUBPARTITIONS <子分区大小>(PARTITION <自定义分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"],...)-- 方式二ALTER TABLE <表名> PARTITION BY <ANGE, LIST分区类型>(<分区字段or值>) [<额外选项>](PARTITION <自定义分区名> <分区表达式>[DATA DIRECTORY="<分区表存储位置>"]-- 分区的子分区数量必须相同, 各个分区下定义的子分区要相同(SUBPARTITION <子分区名1>, ..., SUBPARTITION <子分区名n>),...)
其他操作
- 只要在要操作的分区带上
(SUBPARTITION <子分区名1>, ..., SUBPARTITION <子分区名n>)即可
查看分区表信息
SELECTPARTITION_NAME, -- majorPARTITION_METHOD,PARTITION_EXPRESSION, -- majorPARTITION_DESCRIPTION,TABLE_ROWS, -- majorSUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSIONFROM information_schema.`PARTITIONS`WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME="<table_name>";
