分区表中的数据被存储到多个文件上,减少了I/O负载;对分区对象的查询可以仅搜索自己关心的分区,提高检索速度;如果表的某个分区出现故障,需要修复数据,只修复该分区即可,方便备份和恢复。
DM 提供了水平分区方式,包括范围、哈希和列表三种方式,用户可以使用合适的分区方法,如日期(范围)、区域(列表),对大量数据进行分区,还可以根据应用需求创建多级分区表。
创建范围分区表
范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
create table stu_range
(
sno varchar(10) ,
sname varchar(20),
score int
)
partition by range(score) (
partition part1 values less than(60),
partition part2 values less than(80),
partition part3 values equ or less than(maxvalue)
);
向表中插入测试数据:
insert into stu_range values('001', '张三', 53);
insert into stu_range values('002', '李四',57);
insert into stu_range values('003', '李二',79);
insert into stu_range values('004', '王五',92);
查询数据:
2. 创建LIST分区表
如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。
CREATE TABLE sales_list(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)(
PARTITION p1 VALUES ('西安', '宝鸡'),
PARTITION p2 VALUES ('郑州', '洛阳', '三门峡'),
PARTITION p3 VALUES ('石家庄', '邯郸'),
PARTITION p4 VALUES ('太原', '大同')
);
向表中插入测试数据:
insert into sales_list values(1, '王五', '2020-07-19', '太原');
insert into sales_list values(2, '张三', '2020-07-20', '西安');
insert into sales_list values(3, '李二', '2020-07-21', '太原');
insert into sales_list values(4, '张三', '2020-08-03', '石家庄');
insert into sales_list values(5, '王五', '2020-09-05', '宝鸡');
insert into sales_list values(6, '李四', '2020-09-11', '洛阳');
查询数据:
3.创建哈希分区表
哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。
CREATE TABLE sales_hash(
sales_id INT,
saleman CHAR(20),
saledate DATE,
city CHAR(10)
)
PARTITION BY HASH(city)(
PARTITION p1,
PARTITION p2,
PARTITION p3,
PARTITION p4
);
向表中插入测试数据:
insert into sales_ hash values(1, '王五', '2020-07-19', '太原');
insert into sales_ hash values(2, '张三', '2020-07-20', '西安');
insert into sales_ hash values(3, '李二', '2020-07-21', '太原');
insert into sales_ hash values(4, '张三', '2020-08-03', '石家庄');
insert into sales_ hash values(5, '王五', '2020-09-05', '宝鸡');
insert into sales_ hash values(6, '李四', '2020-09-11', '洛阳');
查询数据:
4.创建多级分区表
很多情况下,经过一次分区并不能精确地对数据进分类,这时需要多级分区表。
CREATE TABLE SALES_MUL(
SALES_ID INT,
SALEMAN CHAR(20),
SALEDATE DATETIME,
CITY CHAR(10)
)
PARTITION BY LIST(CITY)
SUBPARTITION BY RANGE(SALEDATE) SUBPARTITION TEMPLATE(
SUBPARTITION P11 VALUES LESS THAN ('2020-07-01'),
SUBPARTITION P12 VALUES LESS THAN ('2020-08-01'),
SUBPARTITION P13 VALUES LESS THAN ('2020-09-01'),
SUBPARTITION P14 VALUES EQU OR LESS THAN (MAXVALUE))
(
PARTITION P1 VALUES ('北京', '天津')
(
SUBPARTITION P11_1 VALUES LESS THAN ('2012-10-01'),
SUBPARTITION P11_2 VALUES EQU OR LESS THAN (MAXVALUE)
),
PARTITION P2 VALUES ('上海', '南京', '杭州'),
PARTITION P3 VALUES (DEFAULT)
);
向表中插入测试数据:
insert into sales_mul values(1, '王五', '2020-07-19', '太原');
insert into sales_ mul values(2, '张三', '2020-07-20', '北京');
insert into sales_ mul values(3, '李二', '2020-07-21', '天津');
insert into sales_ mul values(4, '张三', '2020-08-03', '上海');
insert into sales_ mul values(5, '王五', '2020-09-05', '宝鸡');
insert into sales_ mul values(6, '李四', '2020-09-11', '洛阳');
查询数据:
1.增加分区
只能对范围分区和 LIST 分区增加分区,不能对哈希分区增加分区。并且增加分区不会影响分区索引,因为分区索引只是局部索引,新增分区仅是新增分区子表,并更新分区主表的分区信息,其他分区并不发生改变。
ALTER TABLE sales_list ADD PARTITION p5 VALUES ('长沙');
增加分区后,查询该表的所有分区:
2.删除分区
只能对范围分区和 LIST 分区进行删除分区,哈希分区不支持删除分区。跟增加分区一样,删除分区不会影响分区索引,因为分区索引只是局部索引,删除分区仅是删除分区子表,并更新分区主表的分区信息,其他分区并不发生改变。
ALTER TABLE sales_list DROP PARTITION p1;
删除分区后,查询该表的所有分区:
3.交换分区
仅范围分区和 LIST 分区支持交换分区,哈希分区表不支持。并且分区交换要求分区表跟交换表具有相同的结构(相同的表类型、相同的 BRANCH 选项、相同的列结构、相同的索引、相同的分布方式),分区交换但并不会校验数据,如交换表的数据是否符合分区范围等,即不能保证分区交换后的分区上的数据符合分区范围。
CREATE TABLE sales_p1(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
);
ALTER TABLE sales_list EXCHANGE PARTITION p1 WITH TABLE sales_p1;
分区交换后,数交换至结构相同的新建表中:
4.合并分区
仅范围分区表支持合并分区,并且合并的分区必须是范围相邻的两分区。另外,合并的分区会导致数据的重组和分区索引的重建,因此,合并分区可能会比较耗时,所需时间取决于分区数据量的大小。
ALTER TABLE stu_range MERGE PARTITIONS part2, part3 into partition p3_4;
合并分区后,查询该表的所有分区:
5.拆分分区
当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区。
ALTER TABLE stu_range SPLIT PARTITION p3_4 AT (60) INTO (PARTITION p3, PARTITION p4);
拆分分区后,查询该表的所有分区:
拆分分区会导致数据的重组和分区索引的重建,因此,拆分分区可能会比较耗时,所需时间取决于分区数据量的大小。