このトピックでは、LIST DEFAULT HASH パーティションテーブルを作成および変更する方法について説明します。
背景情報
PolarDB は、同じレベルで LIST パーティショニングと HASH パーティショニングを組み合わせたハイブリッドパーティショニング戦略をサポートしています。このモデルでは、データはまず一連の LIST パーティションに対して評価されます。定義された LIST 値に一致しないデータは、デフォルトパーティションに配置されます。このデフォルトパーティションがサブパーティション化されている場合、HASH 関数によってデータがサブパーティションに分散されます。このアプローチは、LIST 値が不均等に分散している場合や、考えられるすべての値を列挙することが非現実的なユースケースに最適です。
制限事項
-
ご利用のクラスターは、次のいずれかのバージョン要件を満たす必要があります。クラスターのバージョンを確認するには、「クラスターのバージョンの表示」をご参照ください。
-
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.34 以降。
-
PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.2.1 以降。
-
-
パーティションレベルで 1 つ以上のデフォルトパーティションがサポートされています。
-
サブパーティションには LIST と DEFAULT の組み合わせを使用できますが、各パーティションは 1 つのデフォルトサブパーティションのみをサポートします。
-
パーティションにデフォルトパーティションが 1 つしかない場合、すべてのタイプのサブパーティションがサポートされます。
-
パーティションに複数のデフォルトパーティションがある場合、HASH または KEY サブパーティションのみがサポートされます。
LIST DEFAULT HASH パーティションテーブルの作成
構文
PolarDB では、指定された LIST パーティションに一致しないデータをデフォルトパーティションに格納するパーティションテーブルを作成できます。このパーティションが大きくなりすぎた場合は、HASH メソッドを使用して複数のパーティションに分割できます。
CREATE TABLE [ schema. ]table_name
table_definition
PARTITION BY LIST [COLUMNS] (expr)
SUBPARTITION BY ...
(list_partition_definition[, ..., list_partition_definition],
default_partition_definition
)
default_partition_definition は次のとおりです。
PARTITION partition_name DEFAULT [PARTITIONS number]
各パーティション定義にはサブパーティションを含めることもできます。LIST DEFAULT はサブパーティションでもサポートされており、次のように定義されます。
SUBPARTITION subpartition_name DEFAULT
Parameter Description
|
パラメーター |
説明 |
|
table_name |
作成するテーブルの名前。 |
|
partition_name |
|
|
subpartition_name |
サブパーティションの名前。名前はテーブル内で一意である必要があります。各パーティションには、最大で 1 つのデフォルトサブパーティションを持つことができます。 |
|
number |
HASH メソッドを使用してデフォルトパーティションから作成するパーティションの数を指定します。 |
例
次の例は、単一のデフォルトパーティションを作成する方法を示しています。
CREATE TABLE list_default (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT);
次の例は、複数のデフォルトパーティションを作成する方法を示しています。
CREATE TABLE list_default_hash (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);
次の例は、パーティションキーのデータ型が VARCHAR の場合に LIST COLUMNS を使用する方法を示しています。
CREATE TABLE t_goods
(
country VARCHAR(30),
year VARCHAR(60),
goods TEXT
) PARTITION BY LIST COLUMNS(country)
(
PARTITION p1 VALUES IN ('China'),
PARTITION p2 VALUES IN ('USA'),
PARTITION p3 VALUES IN ('Asia'),
PARTITION p4 VALUES IN ('Singapore'),
PARTITION p_deft DEFAULT PARTITIONS 5
);
EXPLAIN 文を使用してパーティションを表示します。
EXPLAIN SELECT * FROM list_default_hash;
出力は次のとおりです。
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | list_default_hash | p0,p1,pd0,pd1,pd2 | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set (0.04 sec)
次の例は、サブパーティションに LIST DEFAULT を使用する方法を示しています。
CREATE TABLE test (a int, b int)
PARTITION BY RANGE(a)
SUBPARTITION BY LIST(b) (
PARTITION part0 VALUES LESS THAN (10)
( SUBPARTITION sub0 VALUES IN (1,2,3,4,5),
SUBPARTITION sub1 DEFAULT),
PARTITION part1 VALUES LESS THAN (20)
( SUBPARTITION sub2 VALUES IN (1,2,3,4,5),
SUBPARTITION sub3 DEFAULT),
PARTITION part2 VALUES LESS THAN (30)
( SUBPARTITION sub4 VALUES IN (1,2,3,4,5),
SUBPARTITION sub5 DEFAULT));
パーティションに複数のデフォルトパーティションがある場合、HASH または KEY サブパーティションのみがサポートされます。
CREATE TABLE list_default_hash_sub (
a INT,
b INT
)
PARTITION BY LIST (a)
SUBPARTITION BY HASH (b) SUBPARTITIONS 20
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);
LIST DEFAULT HASH パーティションテーブルの変更
LIST DEFAULT HASH パーティションは、ALTER TABLE ADD PARTITION、ALTER TABLE DROP PARTITION、ALTER TABLE REORGANIZE PARTITION、ALTER TABLE TRUNCATE PARTITION、ALTER TABLE EXCHANGE PARTITION、ALTER TABLE OPTIMIZE PARTITION、ALTER TABLE REBUILD PARTITION、ALTER TABLE REPAIR PARTITION、ALTER TABLE ANALYZE PARTITION、ALTER TABLE CHECK PARTITION などの操作をサポートしています。
このトピックでは、ALTER TABLE ADD PARTITION、ALTER TABLE DROP PARTITION、および ALTER TABLE REORGANIZE PARTITION の使用方法について説明します。LIST DEFAULT HASH パーティションテーブルを変更するその他の操作については、「パーティションテーブルの変更」をご参照ください。
ALTER TABLE ADD PARTITION
-
ADD DEFAULT PARTITION
構文
デフォルトパーティションのない標準の LIST パーティションテーブルの場合、
ADD PARTITION文を使用してデフォルトパーティションを追加できます。これにより、テーブルは LIST DEFAULT HASH パーティションテーブルに変換されます。ALTER TABLE table_name ADD PARTITION(default_partition_definition)例
次の例は、単一のデフォルトパーティションを追加する方法を示しています。
CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT);次の例は、2 つのデフォルトパーティションを追加する方法を示しています。
CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT PARTITIONS 2); -
ADD LIST PARTITION
PolarDB for MySQL 8.0.2.2.11 以降では、
ALTER TABLE ADD PARTITION文でWITHOUT VALIDATIONオプションを使用して、LIST DEFAULT HASH パーティションテーブルに LIST パーティションを追加できます。新しい LIST パーティションの値がデフォルトパーティションにまだ存在しないことを確認する必要があります。存在する場合は、
ALTER TABLE REORGANIZE PARTITION文を使用して、データをデフォルトパーティションから新しい LIST パーティションに移動します。構文
ALTER TABLE table_name ADD PARTITION( list_partition_definition[, ..., list_partition_definition]) WITHOUT VALIDATION例
新しい LIST パーティションを追加します。
CREATE TABLE list_default_hash ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3); ALTER TABLE list_default_hash ADD PARTITION( PARTITION p2 VALUES IN (11,12,13) )WITHOUT VALIDATION;実行後、LIST パーティション
p2がlist_default_hashテーブルに追加され、p2にはデータが含まれません。説明デフォルトパーティションに列 a の値 11、12、および 13 が含まれていないことを確認してください。含まれている場合、新しい LIST パーティションを追加した後、これらの行にアクセスできなくなる可能性があります。
ALTER TABLE DROP PARTITION
DROP PARTITION 構文の詳細については、「DROP PARTITION」をご参照ください。
例
DROP PARTITION 操作を使用する場合、すべてのデフォルトパーティションを一度に削除する必要があります。デフォルトパーティションの一部だけを削除することはできません。
DROP PARTITION コマンドを実行して、すべてのパーティションを削除します。
ALTER TABLE list_default_hash DROP PARTITION pd0,pd1,pd2;
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
エラーメッセージ
デフォルトパーティションの一部のみを削除しようとすると、エラーが発生します。
ALTER TABLE list_default_hash DROP PARTITION pd0;
コマンドは次のエラーメッセージを返します。
ERROR 8078 (HY000): DROP PARTITION cannot be used on default partitions of LIST DEFAULT, except once dropping all default partitions
ALTER TABLE REORGANIZE PARTITION
REORGANIZE PARTITION 構文の詳細については、「REORGANIZE PARTITION」をご参照ください。
例
REORGANIZE PARTITION 操作を使用する場合、すべてのデフォルトパーティションを一度に変更する必要があります。デフォルトパーティションの一部だけを変更することはできません。
-
REORGANIZE PARTITIONを使用して、デフォルトパーティションの数を変更します。ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO( PARTITION pd DEFAULT PARTITIONS 3);この文を実行すると、デフォルトパーティションの数が 2 から 3 に変更されます。
-
REORGANIZE PARTITIONを使用して、デフォルトパーティションから新しい LIST パーティションを分割します。ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO ( PARTITION p2 VALUES IN (20,21), PARTITION pd DEFAULT PARTITIONS 2);この文は、
p2という名前の新しい LIST パーティションをテーブルに追加し、VALUES IN (20,21)に一致する行をデフォルトパーティションからp2に移動します。 -
REORGANIZE PARTITIONを使用して、LIST パーティションをデフォルトパーティションにマージします。ALTER TABLE list_default_hash REORGANIZE PARTITION p2, pd0, pd1 INTO ( PARTITION pd DEFAULT PARTITIONS 2);この文は、LIST パーティション
p2をデフォルトパーティションにマージします。 -
REORGANIZE PARTITIONを使用して、デフォルトパーティションから値を移動して LIST パーティションを拡張します。ALTER TABLE list_default_hash REORGANIZE partition p2, pd0, pd1 INTO ( PARTITION p2 VALUES IN (20,21,22,23,24), PARTITION pd DEFAULT PARTITIONS 4);この文は、
p2の定義をPARTITION p2 VALUES IN (20,21)からPARTITION p2 VALUES IN (20,21,22,23,24)に変更します。また、対応するデータをデフォルトパーティションからp2に移動します。