小白带你走进------MYSQL的分区

438 阅读4分钟

Mysql的分区

分区:

将一个表分解成多个区块进行操作,降低每次操作的数据,提高性能,从逻辑上看是一个表,但从物理上看这个表由多个物理分区组成,每个分区都是独立的对象,可以进行独立处理。

  • 查看数据库是否支持分区

    • 老版本:

      SHOW VARIABLES LIKE '%partition%';
      

      新版本:

      show plugins;
      

1、RANGE分区:

PARTITON BY RANGE(id)(
	PARTITION p0 VALUES LESS THEN (5),
    PARTITION p1 VALUES LESS THEN (10),
    PARTITION p2 VALUES LESS THEN (15),
    PARTITION p3 VALUES LESS THEN MAXVALUE
);
  • 从磁盘查看分区

2、LIST分区:

代码如下:

PARTITION BY List(id)(
	PARTITION p0 VALUES in(1,2,3,4),
    PARTITION p1 VALUES in(7,9,10),
    PARTITION p2 VALUES in(11,12,13,14,16)
);

注意:在Mysql5.0以后的新版本中不仅能对int型数据分区,也可以支持非整型的RANGE和LIST分区,如rangle columns、list columns

代码如下:

PARTITION BY RANGE columns(customerId)(
	PARTITION p0 VALUES LESS THEN ('id05'),
    PARTITION p1 VALUES LESS THEN ('id10'),
     PARTITION p2 VALUES LESS THEN ('id15'),
    PARTITION p3 VALUES LESS THEN MAXVALUE
);

字符串类型分区时是按位与进行对应比较的

查询分区:

select * from tbl_user partition (p1);

3、Hash分区: 每次操作分区都要通过表达式计算值,所以性能低下。

hash分区:经过hash表达式运算后得到的值就行分区,(默认是按照取模运算)

例如:10号数据,分为3个区,10%3=1,所以放在2区内.

  • 注意:区号是从0开始。
PARTITION BY HASH(10)
PARTITIONS 3;

查看10号数据所在的分区的所有信息:

explain partitions select * from 表名 where id = 10;

查看10号所在的分区:

select * from 表名 partition (p1);

3.1线性分区 :自定义hash函数(2的幂次方)

优点: 增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量数据的表

缺点:各个分区间数据的分布不大可能均衡。

线性分区代码如下:

PARTITION BY LINEAR HASH(10)
PARTITION 3;

4、Key分区

key分区:与hash分区类似,但是不能自定义表达式,Hash分区只支持整数分区,key可以支持很多数据类型分区,自动选择主键、唯一键来分区,如果没有,则指定分区键。

代码如下:

PARTITION BY LINEAR Key(uuid)
PARTITION 3;

5、子分区

子分区:分区表中每个分区的再次分割,适合保存大量的数据

一般情况下,主分区按照RANGE 分区,子分区按照hash分区

主分区按年分成3个分区,每个分区下有2个按天分成子分区:

PARTITION BY RANGE (YEAR(registerTime))
	SUBPARTITION BY HASH(TO_DAYS(registerTime))
	SUBPARTITIONS 2
	(
    	PARTITION p0 VALUES LESS THEN (2008),
        PARTITION p1 VALUES LESS THEN (2015),
        PARTITION p2 VALUES LESS THEN MAXVALUE
    );

  • 注意:在子分区中,如果要对子分区命名,子分区名称必须相同,数目必须相同

    PARTITION BY RANGE(YEAR(registerTime))
    	SUBPARTITION BY HASH(TO_DAYS(registerTime))
    	(
        	PARTITION p0 VALUES LESS THEN (2008)(
            	SUBPARTITION s0,
                SUBPARTITION s1
            ), 
            PARTITION p1 VALUES LESS THEN (2015)(
            	SUBPARTITION s2,
                SUBPARTITION s3
            ),
            PARTITION p2 VALUES LESS THEN MAXVALUE(
            	SUBPARTITION s4,
                SUBPARTITION s5
            )
        );
    
  • 注意:MYSQL分区处理NULL值的方式:

    在设计数据表的时候声明列为 NOT NULL

分区管理

分区管理:对分区进行添加、删除、定义、合并、拆分等操作

1、RANGE和LIST分区的管理:

1、删除分区并删除数据:

alter table 表名 drop partition p0;
  • 查看创建表的语句组成

    show create table 表名;
    

    2、RANGE 添加分区

    alter table 表名 add partition(partition p2 values less then(50))
    
    • LIST 添加分区

      alter table 表名 add partition(partition p3 values in (1,3,6))
      

  • 注意:RANGE分区:只能添加到新分区列表的高端

  • LIST分区:不能添加已经包含现有分区值列表中的任意值

    3、不删除数据,重新定义分区

  • RANGE 拆分分区:

    ALTER TABLE 表名 REORGANIZE PARTITION p1 INTO(PARTITION s0 values less then(5),PARTITION s1 values less then(10));
    
    • RANGE 合并分区:

      ALTER TABLE 表名 REORGANIZE PARTITION s0,s1 INTO(PARTITION p1 values less then(5));
      
    • LIST 拆分分区:可以添加子分区的值

      ALTER TABLE 表名 REORGANIZE PARTITION p1 INTO(PARTITION s1 values in(1,2,3),PARTITION s2 values in(4,5));
      
      • LIST 合并分区

        ALTER TABLE 表名 REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5))
        

        4、删除所有分区,但是不删除数据

        alter table 表名 remove partitioning;
        

        2、HASH和KEY分区的管理

  • 减少分区数量

    alter table 表名 COALESCE PARTITION 2;
    
  • 添加分区数量

    alter table 表名 add PARTITION partitions 2;
    
  • 重建分区

    alter table 表名 REBUILD PARTITION p2,p3;
    
  • 优化分区

    alter table 表名 OPTIMIZE PARTITION p2,p3;
    
  • 分析分区

    alter table 表名 ANALYZE PARTITION p2,p3;
    
  • 检查分区

    alter table 表名 CHECK PARTITION p2,p3;
    
  • 修补分区

    alter table 表名 REPAIR PARTITION p2,p3;
    

    最后

    对于分区的10条注意点:


今天要分享的就这么多了,期待明天的分库分表吧!!!