MySQL 子分割槽

pursuer.chen發表於2016-11-07

介紹

子分割槽其實是對每個分割槽表的每個分割槽進行再次分隔,目前只有RANGE和LIST分割槽的表可以再進行子分割槽,子分割槽只能是HASH或者KEY分割槽。子分割槽可以將原本的資料進行再次的分割槽劃分。

 

 

一、建立子分割槽

子分割槽由兩種建立方法,一種是不定義每個子分割槽子分割槽的名字和路徑由分割槽決定,二是定義每個子分割槽的分割槽名和各自的路徑

1.不定義每個子分割槽

CREATE TABLE tb_sub (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
    );
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tb_sub';

2.定義每個子分割槽

定義子分割槽可以為每個子分割槽定義具體的分割槽名和分割槽路徑

CREATE TABLE tb_sub_ev (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );

3.測試資料

INSERT INTO tb_sub_ev() VALUES(1,'1989-01-01'),(2,'1989-03-19'),(3,'1989-04-19');

當往裡面插入三條記錄時,其中‘1989-01-01’和‘1989-04-19’儲存在p0_s0分割槽中,‘1989-03-19’儲存在p0_s1當中

二、分割槽管理

分割槽管理和RANGE、LIST的分割槽管理是一樣的

1.合併分割槽

將p0,p1兩個分割槽合併

ALTER TABLE tb_sub_ev REORGANIZE PARTITION p0,p1 INTO (
    PARTITION m1 VALUES LESS THAN (2000)
    ( SUBPARTITION n0,
      SUBPARTITION n1
     ) 
    
);

注意:合併分割槽的子分割槽也必須是兩個,這點需要理解,因為必須和建立分割槽時每個分割槽只有兩個子分割槽保持一致,合併分割槽不會造成資料的丟失。

2.拆分分割槽

ALTER TABLE tb_sub_ev REORGANIZE PARTITION m1 INTO (
     PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        )
    
);

同樣,拆分分割槽也必須保證每個分割槽是兩個子分割槽。

3.刪除分割槽

ALTER TABLE  tb_sub_ev DROP PARTITION P0;

注意:由於分割槽是RANGE和LIST分割槽,所以刪除分割槽也是同RANGE和LIST分割槽一樣,這裡只能對每個分割槽進行刪除,不能針對每個子分割槽進行刪除操作,刪除分割槽後子分割槽連同資料一併被刪除。

三、錯誤的子分割槽建立

1.要不不定義各個子分割槽要不就每個都需要定義

 CREATE TABLE tb_sub_ev_nex (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );  

這裡由於分割槽p1沒有定義子分割槽,所以建立分割槽失敗

四、移除表的分割槽

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分割槽是僅僅移除分割槽的定義,並不會刪除資料和drop PARTITION不一樣,後者會連同資料一起刪除

 

 

分割槽系列文章: 

RANGE分割槽:http://www.cnblogs.com/chenmh/p/5627912.html

LIST分割槽:http://www.cnblogs.com/chenmh/p/5643174.html

COLUMN分割槽:http://www.cnblogs.com/chenmh/p/5630834.html

HASH分割槽:http://www.cnblogs.com/chenmh/p/5644496.html

KEY分割槽:http://www.cnblogs.com/chenmh/p/5647210.html

指定各分割槽路徑:http://www.cnblogs.com/chenmh/p/5644713.html

分割槽建索引:http://www.cnblogs.com/chenmh/p/5761995.html

分割槽介紹總結:http://www.cnblogs.com/chenmh/p/5623474.html

總結

 子分割槽的好處是可以對分割槽的資料進行再分,這樣資料就更加的分散,同時還可以對每個子分割槽定義各自的儲存路徑,這部分內容在指定各分割槽路徑的下一篇文章中單獨進行講解。

 

 

備註:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關文章