MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  パーティション化  /  パーティショニングタイプ

24.2 パーティショニングタイプ

このセクションでは、MySQL 8.0 で使用できるパーティショニングのタイプについて説明します。 これらには、次に一覧したタイプが含まれます。

  • RANGE パーティショニング.  このタイプのパーティショニングは、指定された範囲に含まれるカラム値に基づいて、行をパーティションに割り当てます。 セクション24.2.1「RANGE パーティショニング」を参照してください。 このタイプを拡張した RANGE COLUMNS については、セクション24.2.3.1「RANGE COLUMNS パーティショニング」を参照してください。

  • LIST パーティショニング.  RANGE によるパーティショニングに似ていますが、別個の値のセットのいずれかに一致するカラムに基づいて、パーティションが選択されます。 セクション24.2.2「LIST パーティショニング」を参照してください。 このタイプを拡張した LIST COLUMNS については、セクション24.2.3.2「LIST COLUMNS パーティショニング」を参照してください。

  • HASH パーティショニング.  このタイプのパーティショニングでは、テーブルに挿入される行内のカラム値を操作するユーザー定義式によって返される値に基づいて、パーティションが選択されます。 関数は、負ではない整数値を返す MySQL の有効な式で構成できます。 このタイプを拡張した LINEAR HASH も使用できます。 セクション24.2.4「HASH パーティショニング」を参照してください。

  • KEY パーティショニング.  このタイプのパーティショニングは、HASH によるパーティショニングに似ていますが、評価される 1 つ以上のカラムのみを指定し、MySQL サーバーが独自のハッシュ関数を提供します。 MySQL によって提供されるハッシュ関数ではカラムデータ型に関係なく整数結果が保証されるため、これらのカラムに整数以外の値が含まれていてもかまいません。 このタイプを拡張した LINEAR KEY も使用できます。 セクション24.2.5「KEY パーティショニング」を参照してください。

データベースパーティショニングの非常に一般的な使用方法は、日付によってデータを分けることです。 一部のデータベースシステムは、MySQL 8.0 では実装されていない、明示的な日付パーティショニングをサポートしています。 ただし、MySQL で、DATETIME、または DATETIME カラムに基づいて、またはそのようなカラムを使用する式に基づいて、パーティショニングスキームを作成することは難しくありません。

KEY または LINEAR KEY でパーティショニングする場合は、DATETIME、または DATETIME カラムを、カラム値の変更を実行しないパーティショニングカラムとして使用できます。 たとえば、次のテーブル作成ステートメントは MySQL で完全に有効です。

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;

MySQL 8.0 では、RANGE COLUMNS および LIST COLUMNS パーティショニングを使用して、DATE または DATETIME カラムをパーティショニングカラムとして使用することもできます。

他のパーティション化タイプでは、整数値または NULL を生成するパーティション化式が必要です。 RANGELISTHASH、または LINEAR HASH による日付ベースパーティショニングを使用する場合は、次のように単純に DATETIME、または DATETIME カラムを操作してそのような値を返す関数を使用できます。

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

日付を使用したパーティショニングの追加例は、この章の次のセクションにあります。

日付ベースパーティショニングのより複雑な例については、次のセクションを参照してください。

MySQL パーティショニングは、TO_DAYS()YEAR()、および TO_SECONDS() 関数で使用するために最適化されています。 ただし、整数または NULL を返すほかの日時関数 (WEEKDAY()DAYOFYEAR()MONTH() など) を使用できます。 そのような関数の詳細については、セクション12.7「日付および時間関数」を参照してください。

使用するパーティショニングのタイプにかかわらず、パーティションには作成時に常に 0 から始まる番号が順番に自動的に付けられることを覚えておくことが重要です。 新しい行がパーティション化されたテーブルに挿入されるときは、これらのパーティション番号が正しいパーティションを識別するために使用されます。 たとえば、テーブルで 4 つのパーティションが使用される場合、これらのパーティションには 012、および 3 という番号が付けられます。 RANGE および LIST パーティショニングタイプの場合は、各パーティション番号のパーティションが定義されている必要があります。 HASH パーティション化の場合、ユーザー指定の式は 0 より大きい整数値に評価される必要があります。 KEY パーティショニングの場合は、MySQL サーバーが内部で使用しているハッシュ関数によって、この問題が自動的に対処されます。

パーティションの名前は通常、ほかの MySQL 識別子 (テーブル名、データベース名など) を制御するルールに従っています。 ただし、パーティション名では大/小文字が区別されないことに注意してください。 たとえば、次の CREATE TABLE ステートメントは、示されているように失敗します。

mysql> CREATE TABLE t2 (val INT)
    -> PARTITION BY LIST(val)(
    ->     PARTITION mypart VALUES IN (1,3,5),
    ->     PARTITION MyPart VALUES IN (2,4,6)
    -> );
ERROR 1488 (HY000): Duplicate partition name mypart

失敗は、MySQL がパーティション名 mypartMyPart の違いを認識できないために発生します。

テーブルのパーティション番号を指定するときは、先行ゼロなしのゼロ以外の正の整数リテラルとして表現する必要があり、0.8E+016-2 などの式であってはいけません (これが整数値に評価されるとしても)。 小数は許可されません。

次の各セクションでは、各パーティションタイプの作成に使用できる構文に使用可能なすべての形式を必ずしも指定するわけではありません。この詳細は、セクション13.1.20「CREATE TABLE ステートメント」 を参照してください。


関連キーワード:  パーティショニング, セクション, RANGE, HASH, LIST, タイプ, カラム, COLUMNS, KEY, PARTITION