子分割區—也稱為複合分割區—是對分割區表格中每個分割區的進一步劃分。請考慮以下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 ) );