分类
- RANGE 分区
- 根据连续区间值切分数据
- LIST 分区
- 根据枚举值切分数据
- HASH 分区
- 对整数求模划分数据
- KEY 分区
- 对任何数据类型求模切分数据
注意点
和 mycat 切分规则没有关系
- 各分各的,mycat 区分集群,表分区区分存储位置
分区 key 和主键关系
- 分区 key 必须包含在 PRIMARY KEY 或者 UNIQUE KEY 中
单独的表分区创建语句无法存在
- 要么前面跟一个表定义
- 要么用
ALTER TABLE
来给表创建分区
查看分区表信息
SELECT
PARTITION_NAME, -- major
PARTITION_METHOD,
PARTITION_EXPRESSION, -- major
PARTITION_DESCRIPTION,
TABLE_ROWS, -- major
SUBPARTITION_NAME,
SUBPARTITION_METHOD,
SUBPARTITION_EXPRESSION
FROM 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>
#### 例子
```sql
CREATE 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>
#### 例子
```sql
CREATE 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 p0
DATA DIRECTORY="/mnt/p0/data",
PARTITION p1
DATA 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>
### 创建
```sql
ALTER 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>)
即可
查看分区表信息
SELECT
PARTITION_NAME, -- major
PARTITION_METHOD,
PARTITION_EXPRESSION, -- major
PARTITION_DESCRIPTION,
TABLE_ROWS, -- major
SUBPARTITION_NAME,
SUBPARTITION_METHOD,
SUBPARTITION_EXPRESSION
FROM information_schema.`PARTITIONS`
WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME="<table_name>";