首頁 > 軟體

MySQL分割區之子分割區詳解

2022-04-14 10:04:04

介紹

子分割區其實是對每個分割區表的每個分割區進行再次分隔,目前只有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分割區:https://www.jb51.net/article/244269.htm

COLUMN分割區:https://www.jb51.net/article/96515.htm

LIST分割區:https://www.jb51.net/article/244256.htm

HASH分割區:https://www.jb51.net/article/244277.htm

KEY分割區:https://www.jb51.net/article/244282.htm

子分割區:https://www.jb51.net/article/244294.htm

指定各分割區路徑:https://www.jb51.net/article/244296.htm

分割區索引以及分割區介紹總結:https://www.jb51.net/article/244300.htm

總結

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

到此這篇關於MySQL分割區之子分割區的文章就介紹到這了,更多相關MySQL 子分割區內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com