サブパティショニング(複合パティショニングとも呼ばれます)は,パ。次の创建表
ステトメントを検討します。
CREATE TABLE ts (id INT,已购买日期)PARTITION BY RANGE(年份(已购买))SUBPARTITION BY HASH(TO_DAYS(已购买))SUBPARTITIONS 2(分区p0值小于(1990),分区p1值小于(2000),分区p2值小于MAXVALUE);
テブルts
には3の范围
パティションがあります。これらの各パティション(p0
、p1
,およびp2
)は,さらに2のサブパティションに分割されます。実際には,テブル全体が3 * 2 = 6
パティションに分割されます。ただし,分区的范围
句のアクションによって,これらの最初の2には购买
カラムで値が1990より小さいレコドのみが格納されます。
MySQL 5.6では;范围
または列表
によってパティション化されたテブルをサブパティション化できます。サブパティショニングには,哈希
または关键
パティショニングを使用できます。これは,複合パティショニングとも呼ばれます。
SUBPARTITION通过散列
およびSUBPARTITION的关键
は通常それぞれ,由散列分区
および分区的关键
と同じ構文規則に従います。これの例外は,SUBPARTITION的关键
は現在(分区的关键
と異なり)デフォルトカラムをサポートしないことで,この目的に使用されるカラムを指定する必要があります(テーブルに明示的な主キーがある場合でも)。これは既知の問題であり,対処中です。詳細および例にいてはサブパティションに関する問題を参照してください。
SUBPARTITION
句を使用して個々のサブパーティションのオプションを指定することによって,サブパーティションを明示的に定義することもできます。たとえば,前の例と同じテブルts
をより冗長な形式で作成するには,次のようにします。
CREATE TABLE ts (id INT,已购买日期)PARTITION BY RANGE(年(已购买))SUBPARTITION BY HASH(TO_DAYS(已购买))(分区p0值小于(1990)(分区s0,分区s1),分区p1值小于(2000)(分区s2,分区s3),分区p2值小于MAXVALUE(分区s4,分区s5));
構文に関するいくかの注意事項を次に示します。
各パティションには,同じ数のサブパティションが必要です。
パティション化されたテブルのパティションに
SUBPARTITION
を使用してサブパティションを明示的に定義する場合は,それらのすべてを定義する必要があります。言い換えると,次のステトメントは失敗します。CREATE TABLE ts (id INT, bought DATE) PARTITION BY RANGE(YEAR(bought)) SUBPARTITION BY HASH(TO_DAYS(bought))(分区p0值小于(1990)(SUBPARTITION s0, SUBPARTITION s1),分区p1值小于(2000),分区p2值小于MAXVALUE (SUBPARTITION s2, SUBPARTITION s3));
このステトメントは,
SUBPARTITIONS 2
句を含んでいた場合でも失敗します。各
SUBPARTITION
句には,(少なくとも)サブパティションの名前が含まれている必要があります。それ以外は,サブパーティションに適切なオプションを設定するか,またはそのオプションのデフォルト設定を想定します。サブパティション名はテブル全体で一意である必要があります。たとえば,次の
创建表
ステトメントはMySQL 5.6で有効です。CREATE TABLE ts (id INT,已购买日期)PARTITION BY RANGE(年(已购买))SUBPARTITION BY HASH(TO_DAYS(已购买))(分区p0值小于(1990)(分区s0,分区s1),分区p1值小于(2000)(分区s2,分区s3),分区p2值小于MAXVALUE(分区s4,分区s5));
サブパーティションは,非常に大きいテーブルで,データおよびインデックスを多数のディスクに分散するために使用できます。/ disk0
、/ disk1
、/ disk2
などとしてマウントされた6個のディスクがあるとします。ここで次の例を検討します。
CREATE TABLE ts (id INT, bought DATE) PARTITION BY RANGE(YEAR(bought)) SUBPARTITION BY HASH(TO_DAYS(bought)) (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/idx');
この場合,各范围
のデタおよび。ほかにも多数のバリエションが考えられます。別の例を次に示します。
CREATE TABLE ts (id INT, bought DATE) PARTITION BY RANGE(YEAR(bought)) SUBPARTITION BY HASH(TO_DAYS(bought)) (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小于MAXVALUE (SUBPARTITION s2a, SUBPARTITION s2b));
この場合は,次のように格納されます。
购买
日付が1990年より前の行には大きな領域が使用されるため,4に分割され,パティションp0
を構成する2の各サブパティション(s0a
およびs0b
のデ。言い換えると,次のようになります。サブパティション
s0a
のデタは/ disk0
に格納されます。サブパティション
s0a
のンデックスは,/ disk1
に格納されます。サブパティション
s0b
のデタは,/ disk2
に格納されます。サブパティション
s0b
のンデックスは,/ disk3
に格納されます。
1990年から1999年までの日付(パティション
p1
)が含まれている行は,1990年より前の行ほどの領域を必要としません。これらは,p0
に格納されるレガシレコドの場合の4のディスクではなく,2のディスク(/ disk4
および/ disk5
に分割されます。p1
の最初のサブパティション(s1a
)に属するデタおよびンデックスは,/ disk4
(デタは/ disk4 /数据
,およびおよび/ disk4 idx
に格納されます。p1
の2番目のサブパティション(印地
)に属するデタおよびンデックスは,/ disk5
(デタは/ disk5 /数据
,およびおよび/ disk5 idx
に格納されます。
2000年から現在までの日付(パティション.
p2
)を反映する行には,前の2の範囲で必要とされたほどの領域は使用されません。現在のところ,これらのすべてをデフォルトの場所に格納しても問題ありません。将来,2000年から始まる10年間の購入数が,デフォルトの場所では十分な領域を提供できないほど増えたときには,
ALTER TABLE……重组分区
ステトメントを使用して対応する行を移動できます。これを行う方法にいては,セクション19.3 "パティション管理"を参照してください。
NO_DIR_IN_CREATE
サバSQLモドが有効である場合,数据目录
および索引目录
オプションはパティション定義で許可されません。MySQL 5.6では;これらのオプションはサブパーティションを定義するときにも許可されません (Bug #42954)。