分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能。而对应用来说是透明的,从逻辑上看是只有一个表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理
注:如果表中存在primary key或者unique key时,分区的列必须是primary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集
如果表中不存在任何的primary key或者unique key,则可以指定任何一个列作为分区列
CREATE TABLE `test_staff_partition` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` tinyint(255) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
CREATE TABLE `test_staff_partition_list` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` tinyint(255) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY List (id) (
PARTITION p0 VALUES in (1,2,3,5),
PARTITION p1 VALUES in (7,9,10),
PARTITION p2 VALUES in (11,15)
);
CREATE TABLE `test_staff_partition_hash` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` tinyint(255) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY HASH (id)
PARTITIONS 3;
由于每次插入、更新、删除一行,这个表达式都要计算一次;这意味着非常复杂的表达 式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候
CREATE TABLE `test_staff_partition_key` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` tinyint(255) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY LINEAR Key (id)
PARTITIONS 3;
查看表的分区信息
select * from information_schema.partitions where
table_schema='company' and table_name='test_staff_partition'
查看某个分区的数据
select * from test_staff_partition partition(p3)
在使用分区键进行查询时,会只查该分区键所处的分区
explain select * from test_staff_partition where id = 4
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE test_staff_partition p0 const PRIMARY PRIMARY 4 const 1 100.00
对于range和list分区
当删除了一个分区,也同时删除了该分区中所有的数据
alter table test_staff_partition drop partition p0;
也可以删除所有的分区但是保留数据
alter table test_staff_partition remove partitioning;
对于hash和key分区
alter table test_staff_partition_hash COALESCE PARTITION 2;
对于range和list分区
alter table test_staff_partition add partition(partition p3 values LESS THAN (20));
对于hash和key分区
alter table test_staff_partition_hash add PARTITION partitions 2;
可以在不丢失数据的条件下重新定义分区
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO
(partition_definitions)
类似于先删除保存在分区中的所有记录,然后重新插入它们,可用于整理分区碎片
alter table test_staff_partition REBUILD PARTITION p2,p3;
如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,可以使用“ALTER TABLE ... OPTIMIZE PARTITION”来收回没有使用的空间,并整理分区数据文件的碎片。
alter table test_staff_partition OPTIMIZE PARTITION p2,p3;
读取并保存分区的键分布
alter table test_staff_partition ANALYZE PARTITION p2,p3;
检查分区中的数据或索引是否已经被破坏
alter table test_staff_partition CHECK PARTITION p2,p3;
修补被破坏的分区
alter table test_staff_partition REPAIR PARTITION p2,p3;
https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/26.MySQL分区/
本文由 mdnice 多平台发布