数据库笔记6——分区
mysql分区属于水平切分,如果有主键必须使用主键来分区,查询结果如果跨分区会自动合并
A、 range分区: 必须使用主键来分区,数据分配不均匀
alter table user partition by range(id) (
partition p1 values less than (1),
partition p2 values less than (5),
partition p3 values less than maxvalue
);
B、 hash分区:主要用来确保数据在预先确定数目的分区中平均分布,你所要做的只是基于将要被哈希的列值 指定一个列值或表达式,以及指定被分区的表将要被分割成的分区数量。
create table if not exists `hash_part` (
`id` int(11) not null auto_increment comment '评论id',
`comment` varchar(1000) not null default '' comment '评论',
`ip` varchar(25) not null default '' comment '来源ip',
primary key (`id`)
) engine=innodb default charset=utf8 auto_increment=1
partition by hash(id)
partitions 3;
C、 list分区:
create table if not exists `list_part` (
`id` int(11) not null comment '用户id',
`province_id` int(2) not null default 0 comment '省',
`name` varchar(50) not null default '' comment '名称',
`sex` int(1) not null default '0' comment '0为男,1为女'
) engine=innodb default charset=utf8
partition by list (province_id) (
partition p0 values in (1,2,3),
partition p1 values in (4,5,6),
partition p2 values in (7,8,9),
partition p3 values in (10,11)
);
D、key分区:支持非整数字段的分区
E、 range columns分区:支持datetime字段分区,支持多字段分区
CREATE TABLE rcx (
a INT,
b INT
)
PARTITION BY RANGE COLUMNS(a,b) (
PARTITION p0 VALUES LESS THAN (5,10),
PARTITION p1 VALUES LESS THAN (10,20),
PARTITION p2 VALUES LESS THAN (15,30),
PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);
insert into rcx(a,b)values(1,20),(10,15),(10,30);
第一组值:(1,20);1<5所以不需要再比较20了,该记录属于p0分区。
第二组值:(10,15),10>5,10=10且15<20,所以该记录属于P1分区
第三组值:(10,30),10=10但是30>20,所以它不属于p1,它满足10<15所以它属于p2
F、 list columns分区: 支持datetime字段分区,支持多字段分区
G、 alter table user drop partition p4
删除分区连同数据
H、alter table user remove partitioning
删除分区定义,数据不会删除,恢复回原表