MySql表分区——partition

1、分区的优势

  • 和单个磁盘或文件系统分区相比,能够存储更多的数据。
  • 优化查询。mysql

    • where 子句中包含分区条件时,能够只扫描必要的分区。
    • 涉及聚合函数的查询时,能够容易的在每一个分区上并行处理,最终只需汇总获得结果。
  • 对于已通过期或者不须要保存的数据,能够经过删除与这些数据有关的分区来快速删除数据。
  • 跨多个磁盘来分散数据查询,以得到更大的查询吞吐量。

2、分区方法

将某张表的数据,分别存储到不一样的区域中。每一个分区都是独立的表,都要存储该分区数据的数据、索引等信息。
使用mysql的分区功能,能够把一个大的数据表分红多个小份,用户不须要区分不一样的表名。
表中有主键的时候,分区只能使用主键算法

1. KEY 分区,按照某个字段取余
create table post (
    id int unsigned not null AUTO_INCREMENT,
    title varchar(255),
    PRIMARY KEY (id)
) engine = innodb
partition by key (id) partitions 5;
2. HASH 分区,基于给定的分区个数,把数据分配到不一样的分区。
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

3. RANGE 分区,基于一个给定连续区间范围,把数据分配到不一样的分区
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
 );
4.LIST 分区,相似 RANGE 分区,区别在 LIST 分区是基于枚举出的值列表分区,RANGE 是局域给定的连续区间范围分区。
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 这样包含其余值在内的定义方式,将要匹配的任何值都必须在值列表中找获得。
5. Clumns 分区

是在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)
);
6. 子分区

子分区(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

3、分区管理

1. 取余算法 key hash

采用取余算法的分区数量的修改,不会致使已有分区数据的丢失,须要从新分配数据到新的分区
增长分区: add partition N;
减小分区:coalesce partition N;大数据

2. 条件算法 list range

添加分区优化

alert table goods add partition(
partition p4 values less than 40);

删除分区ui

alert table goods drop partition p1;
注意:删除条件算法的分区,会致使分区数据的丢失

4、mysql 分区处理 null 值的方式

mysql 不由止在分区键值上使用 null , 分区键多是一个字段或者一个用户定义的额表达式。通常状况下,mysql 的分区把 null 看成零值,或者一个最小值进行处理。
range 分区中,null 值会被看成最小值来处理;
list 分区中,null 值必须出如今枚举列表中,不然不被接受;
hash/key 分区中,null 值会被看成零值来处理。code

相关文章
相关标签/搜索