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


24.2.5 KEY パーティショニング

キーによるパーティショニングはハッシュによるパーティショニングと似ていますが、ハッシュパーティショニングはユーザー定義の式を使用し、キーパーティショニング用のハッシュ関数は MySQL サーバーによって提供されます。 NDB Cluster はこの目的のために MD5() を使用します。ほかのストレージエンジンを使用するテーブルの場合、サーバーは独自の内部ハッシュ関数を使用します。

CREATE TABLE ... PARTITION BY KEY の構文規則は、ハッシュによってパーティション化されたテーブルを作成する場合のものと似ています。 主な違いを次に示します。

  • HASH ではなく KEY が使用されます。

  • KEY は、0 個以上のカラム名のリストのみを取ります。 パーティショニングキーとして使用されるカラムは、テーブルの主キーの一部またはすべてを構成している必要があります (テーブルにそれがある場合)。 パーティショニングキーとしてカラム名を指定しない場合は、テーブルの主キーが使用されます (ある場合)。 たとえば、次の CREATE TABLE ステートメントは MySQL 8.0 で有効です。

    CREATE TABLE k1 (
        id INT NOT NULL PRIMARY KEY,
        name VARCHAR(20)
    )
    PARTITION BY KEY()
    PARTITIONS 2;

    主キーはないけれども一意キーはある場合は、パーティショニングキーに一意キーが使用されます。

    CREATE TABLE k1 (
        id INT NOT NULL,
        name VARCHAR(20),
        UNIQUE KEY (id)
    )
    PARTITION BY KEY()
    PARTITIONS 2;

    ただし、一意キーカラムが NOT NULL として定義されていない場合、前のステートメントは失敗します。

    どちらの場合も、パーティショニングキーは id カラムです。ただし、SHOW CREATE TABLE の出力や INFORMATION_SCHEMA.PARTITIONS テーブルの PARTITION_EXPRESSION カラムには表示されません。

    ほかのパーティショニングタイプの場合と異なり、KEY によるパーティショニングに使用されるカラムは、整数または NULL 値に制限されません。 たとえば、次の CREATE TABLE ステートメントは有効です。

    CREATE TABLE tm1 (
        s1 CHAR(32) PRIMARY KEY
    )
    PARTITION BY KEY(s1)
    PARTITIONS 10;

    ほかのパーティショニングタイプが指定された場合、前のステートメントは有効でなくなります (この場合、s1 はテーブルの主キーであるため、単純に PARTITION BY KEY() を使用することも有効であり、PARTITION BY KEY(s1) と同じ効果があります)。

    この問題の詳細については、セクション24.6「パーティショニングの制約と制限」を参照してください。

    インデックス接頭辞を持つカラムは、パーティション化キーではサポートされていません。 つまり、CHAR, VARCHAR, BINARY カラムおよび VARBINARY カラムは、接頭辞を採用していないかぎり、パーティション化キーで使用できます。インデックス定義で BLOB カラムおよび TEXT カラムに接頭辞を指定する必要があるため、これら 2 つのタイプのカラムをパーティション化キーで使用することはできません。 MySQL 8.0.21 より前では、パーティション化されたテーブルの作成、変更、またはアップグレード時に、それらがテーブルのパーティショニングキーに含まれていなくても、接頭辞を使用するカラムは許可されていました。MySQL 8.0.21 以降では、この許容される動作は非推奨であり、そのようなカラムが使用されると、サーバーは適切な警告またはエラーを表示します。 詳細および例については、カラムインデックス接頭辞はキーパーティション化ではサポートされていませんを参照してください。

    注記

    NDB ストレージエンジンを使用するテーブルは、ほかの MySQL ストレージエンジンと同様に、テーブルの主キーをパーティショニングキーとして使用して、KEY によって暗黙的にパーティション化されます。 「NDB Cluster」テーブルに明示的な主キーがない場合は、NDB ストレージエンジンによって生成された各「NDB Cluster」テーブルの「非表示」主キーがパーティション化キーとして使用されます。

    NDB テーブルに明示的なパーティショニングスキームを定義する場合は、テーブルに明示的な主キーが必要であり、パーティショニング式に使用されるカラムがこのキーの一部である必要があります。 ただし、テーブルがのパーティショニング式を使用する (つまり、カラム参照なしの PARTITION BY KEY()) 場合、明示的な主キーは必要ありません。

    このパーティショニングは、ndb_desc ユーティリティー (-p オプション付き) を使用して確認できます。

    重要

    キーによってパーティション化されたテーブルの場合は、ALTER TABLE DROP PRIMARY KEY を実行できません。それを実行すると次のエラーが生成されます: ERROR 1466 (HY000): Field in list of fields for partition function not found in table。 これは、KEY によってパーティション化された「NDB Cluster」テーブルでは問題ではありません。このような場合、テーブルは「非表示」主キーをテーブルの新しいパーティション化キーとして使用して再編成されます。 第23章「MySQL NDB Cluster 8.0を参照してください。

リニアキーによってテーブルをパーティション化することもできます。 次に、単純な例を示します。

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

LINEAR キーワードは、KEY パーティション化と HASH パーティション化で同じ効果を持ち、パーティション番号はモジュロ演算ではなく 2 乗アルゴリズムを使用して導出されます。 このアルゴリズムの説明およびその影響については、セクション24.2.4.1「LINEAR HASH パーティショニング」を参照してください。


関連キーワード:  テーブル, パーティショニング, KEY, カラム, キー, NDB, TABLE, PARTITION, CREATE, ストレージ