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