分区表就是按照某种规则将同一张表的数据分段划分到多个存储位置。对数据的分区存储提高了数据库的性能,被分去存储的数据在物理上是多个文件,但在逻辑上仍然是一个表,对表的任何操作都和没有分区之前一样。在执行增删改查等操作时,数据库会自动通过找到对应的分区,然后执行操作。
Tip:
MySQL 支持的分区类型包括 Range、List、Hash 和 Key,最常用的是 Range。
create table student(
id int not null auto_increment,
name varchar(30),
year int,
province int,
primary key(id,year)
)
partition by RANGE(year)(
partition p1 VALUES LESS THAN (1990) DATA DIRECTORY='d:/data/p1',
partition p2 VALUES LESS THAN (1995) DATA DIRECTORY='d:/data/p2',
partition p3 VALUES LESS THAN (2000) DATA DIRECTORY='d:/data/p3',
partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY='d:/data/p4',
)
代码中首先创建了一个 student 表,然后以 year 字段分区,在 SQL 中 p1、p2、p3、p4 是分区名称,紧跟在 VALUES 后面的是分区条件,DATA DIRECTORY 是分区文件存储的位置。这里需要注意的是如果想要使用某个字段进行 Range 分区,则逐渐必须包含分区字段。
create table student(
id int not null auto_increment,
name varchar(30),
age int,
province int,
primary key(id,age)
)
partition by RANGE(age)(
partition p1 VALUES IN (20,21,22,23,24),
partition p2 VALUES IN (25,26,27,28,29),
partition p3 VALUES IN (30,31,32,33,34)
)
create table student(
id int not null auto_increment,
name varchar(30),
age int,
province int,
primary key(id,age)
)
partition by HASH(age)
partition 10;
create table student(
id int not null auto_increment,
name varchar(30),
age int,
province int,
primary key(id,age)
)
partition by key(age)
partition 10;
# 语法
alter table 'table_name' add partition(分区条件)
# 例子
alter table 'student' add partition(paetition p5 VALUES LESS THAN MAXVALUE);
# 语法
alter table 'table_name' partition by 分区类型(分区条件列)(
分区条件
)
# 例子
alter table 'student' partition by RANGE(age)(
partition p1 VALUES LESS THAN (20) DATA DIRECTPRY='d:/data/p1',
partition p2 VALUES LESS THAN (30) DATA DIRECTPRY='d:/data/p2',
partition p3 VALUES LESS THAN (40) DATA DIRECTPRY='d:/data/p3',
partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTPRY='d:/data/p4',
)
# 语法
alter table 'table_name' drop partition 分区名称;
# 例子
alter table 'student' drop partition p1;
# 语法
alter table 'table_name' remove partitioning
# 例子
alter table 'student' remove partitioning
Tip:删除分区会删除分区下的数据,移除分区数据不会被移除,另外删除分区可以指定要删除的分区,但移除分区是移除整个表的分区。删除分区不适用于使用 HASH分区的表。