优化查询。mysql
将某张表的数据,分别存储到不一样的区域中。每一个分区都是独立的表,都要存储该分区数据的数据、索引等信息。
使用mysql的分区功能,能够把一个大的数据表分红多个小份,用户不须要区分不一样的表名。
表中有主键的时候,分区只能使用主键算法
create table post ( id int unsigned not null AUTO_INCREMENT, title varchar(255), PRIMARY KEY (id) ) engine = innodb partition by key (id) partitions 5;
create table student_hash( id int unsigned not null auto_increment, birthday date, PRIMARY KEY(id,birthday); ) engine=myisam partition by hash (month(birthday)) patitions 12;
key 和 hash 分区方法能够有效的分散热点数据。sql
create table goods ( id int, uname char(10) )engine myisam partition by range(id) ( partition p1 values less than (10), partition p2 values less than (20), partition p3 values less than MAXVALUE );
create table user ( uid int, pid int, uname )engine myisam partition by list(pid) ( partition bj values in (1), partition ah values in (2), partition xb values in (4,5,6) ); # 若是试图插入的列值不包含分区值列表中时,那么 insert 操做会失败并报错,要重点注意的是,list 分区不存在相似 values less than maxvalue 这样包含其余值在内的定义方式,将要匹配的任何值都必须在值列表中找获得。
是在mysql5.5引入的分区类型,解决了以前版本 range 和 list 分区只支持整数分区,从而致使须要额外的函数计算获得整数或经过额外的转换表来转换为整数再分区的问题。
Columns 分区能够细分为 range columns 分区和 list columns 分区,这两种分区都支持整数,日期和字符串三大数据类型。
columns 分区的另外一个亮点是支持多列分区:less
mysql> create table rc3( a int, b int ) partition by range columns(a,b)( partition p01 values less than (0,10), partition p02 values less than (10,10), partition p03 values less than (10,20), partition p04 values less than (10,35), partition p05 values less than (10,maxvalue), partition p06 values less than (maxvalue,maxvalue) );
子分区(subpartitioning)是分区表中对每一个分区的再次分割,又被称为符合分区(composite partitioning)。mysql 从 mysql 5.1 开始支持对已经经过 range 或者 list 分区了的表再进行子分区,子分区既可使用 hash 分区,也可使用 key 分区。函数
mysql> create table ts (id int, purchased date) partition by range(year(purchased)) subpartition by hash (to_days(purchased)) subpartitions 2 ( partition p0 values less than (1990), partition p1 values less than (2000), partition p2 values less than maxvalue, );
表 ts 有3个 range 分区,这 3 个分区中的每一个分区又进一步分红 2 个子分区,实际上,整个表被分红了 3*2=6 个分区,因为 partition by range 子句的做用,第一和第二个分区只保存 purchased 列中值小于 1990 的记录。
复合分区适用于保存很是大量的数据记录。post
采用取余算法的分区数量的修改,不会致使已有分区数据的丢失,须要从新分配数据到新的分区
增长分区: add partition N;
减小分区:coalesce partition N;大数据
添加分区优化
alert table goods add partition( partition p4 values less than 40);
删除分区ui
alert table goods drop partition p1; 注意:删除条件算法的分区,会致使分区数据的丢失
mysql 不由止在分区键值上使用 null , 分区键多是一个字段或者一个用户定义的额表达式。通常状况下,mysql 的分区把 null 看成零值,或者一个最小值进行处理。
range 分区中,null 值会被看成最小值来处理;
list 分区中,null 值必须出如今枚举列表中,不然不被接受;
hash/key 分区中,null 值会被看成零值来处理。code