The world's most popular open source database
サブ分割、— もしくは
コンポジット分割 —
はパーティションドテーブルのパーティションをさらに分けることを指します。例えば、以下の
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
の値より少ないレコードのみが記憶されます。
MySQL 5.1 では、RANGE や
LIST
によってパーティションドテーブルをさらにサブ分割することが可能です。サブ分割は
HASH または 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 節は(最低でも)
サブ分割の名称を含んでいなければいけません。でなければ、サブ分割に要求どおりのオプションを設定するか、そのオプションのデフォルト設定にもどします。
MySQL 5.1.7
以前では、サブ分割の名称は各分割内ではユニークである必要がありましたが、テーブル全体の中でユニークである必要はありませんでした。MySQL
5.1.8
に始まり、サブ分割名称はテーブル全体においてユニークであることが必要になりました。たとえば、以下の
CREATE TABLE
ステートメントはMySQL 5.1.8以降有効です。
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
)
);
(以前のステートメントは MySQL 5.1.8. 以前でも有効です。)
サブ分割はデータやインデックスを複数のディスク上分布するために特に大きなテーブルと使用することができます。例えば、/disk0、/disk1、/disk2
とつづく6つのディスクを重ねていたとします。以下の例を検討してください。
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
DATA DIRECTORY = '/disk0/data'
INDEX DIRECTORY = '/disk0/idx',
SUBPARTITION s1
DATA DIRECTORY = '/disk1/data'
INDEX DIRECTORY = '/disk1/idx'
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s2
DATA DIRECTORY = '/disk2/data'
INDEX DIRECTORY = '/disk2/idx',
SUBPARTITION s3
DATA DIRECTORY = '/disk3/data'
INDEX DIRECTORY = '/disk3/idx'
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s4
DATA DIRECTORY = '/disk4/data'
INDEX DIRECTORY = '/disk4/idx',
SUBPARTITION s5
DATA DIRECTORY = '/disk5/data'
INDEX DIRECTORY = '/disk5/idx'
)
);
この場合、データと各 RANGE
インデックスごとに別のディスクが使用されています。他にもバリエーションが考えられます。例えば:
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 s0a
DATA DIRECTORY = '/disk0'
INDEX DIRECTORY = '/disk1',
SUBPARTITION s0b
DATA DIRECTORY = '/disk2'
INDEX DIRECTORY = '/disk3'
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s1a
DATA DIRECTORY = '/disk4/data'
INDEX DIRECTORY = '/disk4/idx',
SUBPARTITION s1b
DATA DIRECTORY = '/disk5/data'
INDEX DIRECTORY = '/disk5/idx'
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s2a,
SUBPARTITION s2b
)
);
ここでは、ストレージは以下のようになります。
purchased 日付が1990
以前の行は大容量を必要とするため、4つに分けられています。これは別のディスクをデータと各サブ分割専用に割り当て、(s0a
と s0b) p0
分割を作成する。言い換えると:
サブ分割 s0a のデータは
/disk0
に記憶されています。
サブ分割 s0a
のインデックスは /disk01
に記憶されています。
サブ分割 s0b のデータは
/disk2
に記憶されています。
サブ分割 s0b
のインデックスは /disk3
に記憶されています。
1990 から1999を含む行は(分割 p1)
1990
以前のものと比べ、容量を多く要求しません。p0
で記憶されている4つのディスクのレガシィレコードと比べ、これらは2つのディスク上振り分けられています。(/disk4
と /disk5)
p1
の最初のサブ分割に含まれるデータやインデックスは(s1a)
は /disk4 に記憶され、
— /disk4/data
のデータ、/disk4/idx
内のインデックス
p1
の2番目ののサブ分割に含まれるデータやインデックスは(s1b)
は /disk5 に記憶され、
— /disk5/data
のデータ、/disk5/idx
内のインデックス
2000年から現在を示す(分割 p2)
行は、以前の2レンジで必要とされたほどのスペースは要求されません。現在では、デフォルト位置にこれら全てを記憶することで事足ります。
将来的に、2000年から始まった購入のデータ量がデフォルト位置内で支えきれなくなった時、ALTER
TABLE ... REORGANIZE PARTITION
ステートメントを使用してそれらの行は移動させることができます。詳細については、項15.3. 「パーティショニング管理」
を参照してください。

