子分割區—也稱為複合分割區—是對分割區表格中每個分割區的進一步劃分。考慮以下 CREATE TABLE
語句
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
分割區。這些分割區中的每一個—p0
、p1
和 p2
—進一步劃分為 2 個子分割區。實際上,整個表格被劃分為 3 * 2 = 6
個分割區。但是,由於 PARTITION BY RANGE
子句的作用,前 2 個分割區僅儲存 purchased
欄位中小於 1990 的記錄。
可以對以 RANGE
或 LIST
分割的表格進行子分割區。子分割區可以使用 HASH
或 KEY
分割區。這也稱為複合分割區。
SUBPARTITION BY HASH
和 SUBPARTITION BY KEY
通常遵循與 PARTITION BY HASH
和 PARTITION BY KEY
相同的語法規則。一個例外是 SUBPARTITION BY KEY
(與 PARTITION BY KEY
不同) 目前不支援預設欄位,因此即使表格具有明確的主鍵,也必須指定用於此目的的欄位。這是一個已知問題,我們正在努力解決;請參閱子分割區的問題,以取得更多資訊和範例。
也可以使用 SUBPARTITION
子句明確定義子分割區,以指定個別子分割區的選項。例如,以更詳細的方式建立與先前範例中顯示的相同表格 ts
會是
CREATE TABLE ts (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
)
);
此處列出一些值得注意的語法項目
每個分割區必須具有相同數量的子分割區。
如果您在分割區表格的任何分割區上使用
SUBPARTITION
明確定義任何子分割區,則必須定義所有子分割區。換句話說,以下語句會失敗CREATE TABLE ts (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 s2, SUBPARTITION s3 ) );
即使它使用了
SUBPARTITIONS 2
,此語句仍然會失敗。每個
SUBPARTITION
子句必須至少包含子分割區的名稱。否則,您可以為子分割區設定任何所需的選項,或允許其假設該選項的預設設定。子分割區名稱在整個表格中必須是唯一的。例如,以下
CREATE TABLE
語句是有效的CREATE TABLE ts (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 ) );