list分区
list分区与range分区有类似的地方
list分区字段必须是整型或者转换为整型
按照某个字段上的规则,不同的数据离散地分布在不同的区中。
语法:
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
partition by LIST (分区字段或者基于该字段的返回的整数值的表达式) (
partition <分区名称> values IN (Value1,Value2, Value3),
...
partition <分区名称> values IN (Value4, Value5),
);
list:表示固定值进行分区
分区名称: 要保证不同,也可以采用 p0、p1、p2 这样的分区名称,
ValueN : 表示某个具体的值
demo1:
假定你需要将超市员工划分地区,该表有40家超市职员记录。这40家超市的编号从1到40。而这40家超市分布在5个有经销权的地区,店铺分布如下表示
地区 | 店铺id号 |
---|---|
东区 | 1,2,3,4,5,6,7,8 |
南区 | 17,18,19,20,21,22,23,24 |
西区 | 33,34,35,36,37,38,39,40 |
北区 | 9,10,11,12,13,14,15,16 |
中心区 | 25,26,27,28,29,30,31,32 |
CREATE TABLE `employees_list` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ename` varchar(30) NOT NULL DEFAULT '' COMMENT '员工名称',
`ecode` varchar(30) NOT NULL DEFAULT '' COMMENT '员工编号',
`store_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '所属门店',
`create_time` datetime(6) DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`id`,`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'
partition by list(store_id)(
partition p0 values in (1,2,3,4,5,6,7,8),
partition p1 values in (17,18,19,20,21,22,23,24),
partition p2 values in (33,34,35,36,37,38,39,40),
partition p3 values in (9,10,11,12,13,14,15,16),
partition p4 values in (25,26,27,28,29,30,31,32)
);
分区文件(截图):
1.新增分区:
地区 | 店铺id号 |
---|---|
华南地区 | 41,42,43,44,45,46,47,48 |
alter table employees_list add partition (partition p5 values in (41,42,43,44,45,46,47,48));
2.合并分区,重置分区
将华南区和南区合并
地区 | 店铺id号 |
---|---|
华南地区,南区 | 41,42,43,44,45,46,47,48, 17,18,19,20,21,22,23,24 |
alter table employees_list
REORGANIZE PARTITION p0,p1,p2,p3,p4,p5 INTO
(
partition p0 values in (1,2,3,4,5,6,7,8),
partition p1 values in (17,18,19,20,21,22,23,24,41,42,43,44,45,46,47,48),
partition p2 values in (33,34,35,36,37,38,39,40),
partition p3 values in (9,10,11,12,13,14,15,16),
partition p4 values in (25,26,27,28,29,30,31,32)
)
3.删除分区
alter table employees_list drop partition p4;
4.移除表的分区
alter table employees_list remove partitioning;