MySQL分区操作

一、分区简介

RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不能重叠。使用

“VALUES LESS THAN ()” 来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值。

二、操作实例

1、在数据表user 建立分区 (每50条一个分区)
1 create table user1( 
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) )ENGINE=InnoDB AUTO_INCREMENT=249 DEFAULT CHARSET=utf8 partition by range(month(created_at))(
partition p1 values less than(50),
partition p2 values less than(100),
partition p3 values less than(150),
partition p4 values less than(200),
partition p5 values less than MAXVALUE );
2、插入数据查看分区的存储情况如下:
1 select partition_name,PARTITION_DESCRIPTION,PARTITION_EXPRESSION,table_rows from information_schema.partitions where table_name = 'user1'
 
 
3、数据查询
1 EXPLAIN SELECT * FROM user1 WHERE id = 68
 
 
4、分区添加和删除
 
##增加新的分区
1 -- 注意:增加分区只能在最大端增加 
2 alter table user1 add PARTITION (PARTITION p4 VALUES LESS THAN MAXVALUE);
##删除分区
 
alter table user1 drop PARTITION p4;
注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!。但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。
 
##移除表的分区
 
1 ALTER TABLE user1 REMOVE PARTITIONING ;
注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除
 
5、拆分合并分区
 
例1:将P0拆分成s1,s2两个分区
1 ALTER TABLE employees REORGANIZE PARTITION p0 INTO ( PARTITION s0 VALUES LESS THAN (3), PARTITION s1 VALUES LESS THAN (6) );
注意:原来分区p0的范围是[负无穷-6),所以新拆分的分区也必须是这范围,所以新的分区范围值最大不能超过6。
 
分区由原来的p0[-6)变成了so[-3),s1[3-6),整个分区的范围还是不变。
 
例2:将s1,p1,p2合并为a,b两个分区
1 ALTER TABLE employees REORGANIZE PARTITION s1,p1,p2 INTO ( PARTITION a VALUES LESS THAN (5), PARTITION b VALUES LESS THAN (16) );
原本的s1,p1,p2分区范围是:[3-16)所以新的分区也必须和原本的分区相同,所以新的分区的值不能低于3不能高于16即可。
 
 
分区由原来的s1[3-6),p1[6-11),p2[11-16)变成了现在的a[3-5),b[5-16),总的范围没有发生变化
注意:无论是拆分还是合并分区都不能改变分区原本的覆盖范围,并且合并分区只能合并连续的分区不能跳过分区合并;并且不能改变分区的类型,例如不能把range分区改成key分区等。
 
参考资料:https://www.cnblogs.com/chenmh/p/5627912.html

原文地址:https://www.cnblogs.com/guliang/p/11717906.html