マニュアルパーティショニング
パーティションカラム
-
パーティションカラムは1つまたは複数のカラムとして指定でき、パーティションカラムはKEYカラムである必要があります。
-
allow_partition_column_nullableがtrueに設定されている場合、RangeパーティションはNULLパーティションカラムの使用をサポートします。ListパーティションはNULLパーティションカラムを常にサポートしません。 -
パーティションカラムのタイプに関係なく、パーティション値を記述する際にはダブルクォートが必要です。
-
パーティション数には理論的に上限はありません。ただし、各テーブルはデフォルトで4096パーティションに制限されています。この制限を超えたい場合は、FE設定パラメータ
max_multi_partition_numとmax_dynamic_partition_numを変更できます。 -
パーティショニングなしでテーブルを作成する場合、システムは自動的にテーブル名と同じ名前のフルレンジパーティションを生成します。このパーティションはユーザーには見えず、削除や変更はできません。
-
パーティションを作成する際、重複する範囲は許可されません。
RANGEパーティショニング
パーティションカラムは通常、古いデータと新しいデータの便利な管理のための時間カラムです。RANGEパーティショニングはDATE、DATETIME、TIMESTAMPTZ、TINYINT、SMALLINT、INT、BIGINT、LARGEINTなどのカラムタイプをサポートします。
パーティション情報は以下の4つの記述方法をサポートします:
FIXED RANGE:この方法はパーティションを左閉右開区間として定義します。
PARTITION BY RANGE(col1[, col2, ...])
(
PARTITION partition_name1 VALUES [("k1-lower1", "k2-lower1", "k3-lower1",...), ("k1-upper1", "k2-upper1", "k3-upper1", ...)),
PARTITION partition_name2 VALUES [("k1-lower1-2", "k2-lower1-2", ...), ("k1-upper1-2", MAXVALUE, ))
)
例えば:
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES [("2017-01-01"), ("2017-02-01")),
PARTITION `p201702` VALUES [("2017-02-01"), ("2017-03-01")),
PARTITION `p201703` VALUES [("2017-03-01"), ("2017-04-01"))
)
LESS THAN: このメソッドはパーティションの上限のみを定義します。下限は前のパーティションの上限によって決定されます。
PARTITION BY RANGE(col1[, col2, ...])
(
PARTITION partition_name1 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...),
PARTITION partition_name2 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...)
)
例えば:
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
)
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
PARTITION `other` VALUES LESS THAN (MAXVALUE)
)
BATCH RANGE: この方式は数値または時間の範囲に基づいてパーティションを一括作成し、パーティションを左閉右開区間として定義し、ステップサイズを設定します。
PARTITION BY RANGE(int_col)
(
FROM (start_num) TO (end_num) INTERVAL interval_value
)
PARTITION BY RANGE(date_col)
(
FROM ("start_date") TO ("end_date") INTERVAL num YEAR | num MONTH | num WEEK | num DAY | 1 HOUR
)
例えば:
PARTITION BY RANGE(age)
(
FROM (1) TO (100) INTERVAL 10
)
PARTITION BY RANGE(`date`)
(
FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 2 YEAR
)
MULTI RANGE: この方法は範囲パーティション分割に基づいてパーティションをバッチ作成し、パーティションを左閉右開区間として定義します。例えば:
PARTITION BY RANGE(col)
(
FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 1 YEAR,
FROM ("2021-11-14") TO ("2022-11-14") INTERVAL 1 MONTH,
FROM ("2022-11-14") TO ("2023-01-03") INTERVAL 1 WEEK,
FROM ("2023-01-03") TO ("2023-01-14") INTERVAL 1 DAY,
PARTITION p_20230114 VALUES [('2023-01-14'), ('2023-01-15'))
)
LIST パーティション分割
LIST パーティション分割に基づくパーティションカラムは、BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、DATETIME、TIMESTAMPTZ、CHAR、VARCHARなどのデータ型をサポートします。パーティション値は列挙値です。データが対象パーティションの列挙値の一つである場合のみ、パーティションにヒットできます。
パーティションはVALUES IN (...)を通じて各パーティションに含まれる列挙値の指定をサポートします。
例:
PARTITION BY LIST(city)
(
PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
PARTITION `p_jp` VALUES IN ("Tokyo")
)
LIST パーティショニングは、マルチカラムパーティショニングもサポートします。例:
PARTITION BY LIST(id, city)
(
PARTITION p1_city VALUES IN (("1", "Beijing"), ("1", "Shanghai")),
PARTITION p2_city VALUES IN (("2", "Beijing"), ("2", "Shanghai")),
PARTITION p3_city VALUES IN (("3", "Beijing"), ("3", "Shanghai"))
)
NULL パーティショニング
NULL パーティショニングに基づくパーティション列は、デフォルトでnot null列である必要があります。null列を使用する必要がある場合は、セッション変数allow_partition_column_nullableをtrueに設定してください。LISTパーティショニングではNULLパーティショニングがサポートされていますが、RANGEパーティショニングではnull値はless thanパーティションに割り当てられます。列は以下の通りです:
LISTパーティショニング
mysql> create table null_list(
-> k0 varchar null
-> )
-> partition by list (k0)
-> (
-> PARTITION pX values in ((NULL))
-> )
-> DISTRIBUTED BY HASH(`k0`) BUCKETS 1
-> properties("replication_num" = "1");
Query OK, 0 rows affected (0.11 sec)
mysql> insert into null_list values (null);
Query OK, 1 row affected (0.19 sec)
mysql> select * from null_list;
+------+
| k0 |
+------+
| NULL |
+------+
1 row in set (0.18 sec)
less thanパーティションを使用したRANGEパーティショニング
mysql> create table null_range(
-> k0 int null
-> )
-> partition by range (k0)
-> (
-> PARTITION p10 values less than (10),
-> PARTITION p100 values less than (100),
-> PARTITION pMAX values less than (maxvalue)
-> )
-> DISTRIBUTED BY HASH(`k0`) BUCKETS 1
-> properties("replication_num" = "1");
Query OK, 0 rows affected (0.12 sec)
mysql> insert into null_range values (null);
Query OK, 1 row affected (0.19 sec)
mysql> select * from null_range partition(p10);
+------+
| k0 |
+------+
| NULL |
+------+
1 row in set (0.18 sec)
less thanパーティション以外のRANGEパーティショニング
mysql> create table null_range2(
-> k0 int null
-> )
-> partition by range (k0)
-> (
-> PARTITION p200 values [("100"), ("200"))
-> )
-> DISTRIBUTED BY HASH(`k0`) BUCKETS 1
-> properties("replication_num" = "1");
Query OK, 0 rows affected (0.13 sec)
mysql> insert into null_range2 values (null);
ERROR 5025 (HY000): Insert has filtered data in strict mode, tracking_url=......