key分区
按照key进行分区非常类似于按照hash进行分区,只不过hash分区允许使用用户自定义的表达式
与hash分区不用的是,key分区不允许使用用于自定义的表达式,需要使用mysql服务器提供的hash函数,不需要hash分区那样对字段整型进行转换,
同时hash分区只支持整数分区,而key分区支持使用出blob or text类型外的其他类型的列作为分区键。
和hash功能一样,不同的是分区的字段可以是非int类型,如字符串、日期等类型。
语法:
create table <table> (
// 字段
) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
#方法1:
partition by key(expr) partitions num;
#方法2(不指定默认首选主键作为分区键,在没有主键的情况下会选择非空唯一键作为分区键):
partition by key() partitions num;
#方法3(支持线性分区linear key):
partition by linear key(expr)
expr:是零个或者多个字段名的列表
num:表示分区数量
key分区也支持线性分区linear key
demo1:
该表有40家超市职员记录,假定你需要将超市员工按入职时期进行分别存储,
#方法1
CREATE TABLE `employees_key_create_time` (
`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) NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'
partition by key(create_time)
partitions 5;
分区文件(截图):
demo2:
该表有40家超市职员记录,假定你需要将超市员工按唯一主键进行分别存储,
#方法2:
CREATE TABLE `employees_key_id` (
`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) NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'
partition by key()
partitions 5;
分区文件(截图):
demo3:
该表有40家超市职员记录,假定你需要将超市员工按唯一主键(线性分区)进行分别存储,
#方法3:
CREATE TABLE `employees_key_linear` (
`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) NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'
partition by linear key (id)
分区文件(截图):
【注意:key分区只能重置分区不能删除或添加分区】
1.重置分区
alter table employees_key_create_time add partition partitions 6;
alter table employees_key_id add partition partitions 6;
alter table employees_key_linear add partition partitions 4;
2.移除表的分区
alter table employees_key_create_time remove partitioning;