MySQL从5.1版本开始支持分区的功能。分区是指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上这个表可能由数10个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。
目前MySQL支持一下四种类型的分区:
如果表存在主键或者唯一索引时,分区列必须是唯一索引的一个组成部分,即将分区字段和唯一索引创建组合索引。
如下创建一个test1表,创建三个分区,当time字段值小于1704038400时放入part0分区,当time字段值小于1735660800时放入part1分区,其余数据放入part2分区
- CREATE TABLE `test1` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `time` int(11) NOT NULL DEFAULT 0 COMMENT '时间',
- PRIMARY KEY (`id`,`time`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- PARTITION BY RANGE (time) PARTITIONS 3 (
- PARTITION part0 VALUES LESS THAN (1704038400),
- PARTITION part1 VALUES LESS THAN (1735660800),
- PARTITION part2 VALUES LESS THAN MAXVALUE
- );
如下创建一个test2表,创建两个分区,将status值为0和1的放入part0分区,将status值为2和3的放入part1分区
- CREATE TABLE `test2` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `status` tinyint(2) NOT NULL DEFAULT 0 COMMENT 'status',
- PRIMARY KEY (`id`,`status`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- PARTITION BY LIST(status) (
- PARTITION part0 VALUES IN (0,1),
- PARTITION part1 VALUES IN (2,3)
- );
LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。所以将要匹配的任何值都必须在值列表中能够找到
如下创建一个test3表,并创建三个HASH分区,在HASH分区中,MySQL自动完成分配记录到区间的工作,你所要做的只是确定一个用来做哈希的字段或者表达式,以及指定被分区的表将要被分割成的分区数量
- CREATE TABLE `test3` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `status` tinyint(2) NOT NULL DEFAULT 0 COMMENT 'status',
- PRIMARY KEY (`id`,`status`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- PARTITION BY HASH (status) PARTITIONS 3;
- hash分区的字段不能太复杂,否则插入将会有性能的影响
- hash分区的优势在对单条数据的查找,范围查找的性能不如RANGE分区
- hash分区只支持数字分区,或用表达式将字符串转成数字
如下创建一个test4表,并创建三个KEY分区,key分区类似于hash分区,本质区别是hash分区使用的是用户自定义的表达式,而key分区函数是由MySQL 服务器提供的,不同的存储引擎使用不同的内部函数。 创建key分区的语法和hash分区差不多
- CREATE TABLE `test4` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `status` tinyint(2) NOT NULL DEFAULT 0 COMMENT 'status',
- PRIMARY KEY (`id`,`status`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- PARTITION BY KEY (status) PARTITIONS 3;
KEY分区和HASH分区区别
alter table test(表名) drop partition p1(分区名);
alter table test(表名) truncate partition p1(分区名);
alert table test(表名) remove PARTITIONING ;