キーによるパーティショニングはハッシュによるパーティショニングと似ていますが、ハッシュパーティショニングはユーザー定義の式を使用し、キーパーティショニング用のハッシュ関数は 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 パーティショニング」を参照してください。