キーによるパーティショニングはハッシュによるパーティショニングと似ていますが、ハッシュパーティショニングはユーザー定義の式を使用し、キーパーティショニング用のハッシュ関数は MySQL サーバーによって提供されます。MySQL Cluster はこのために MD5()
を使用します。ほかのストレージエンジンを使用するテーブルの場合、サーバーは PASSWORD()
と同じアルゴリズムに基づく独自の内部ハッシュ関数を使用します。
CREATE TABLE ... PARTITION BY KEY
の構文規則は、ハッシュによってパーティション化されたテーブルを作成する場合のものと似ています。主な違いを次に示します。
HASH
ではなくKEY
が使用されます。-
KEY
は、0 個以上のカラム名のリストのみを取ります。パーティショニングキーとして使用されるカラムは、テーブルの主キーの一部またはすべてを構成している必要があります (テーブルにそれがある場合)。パーティショニングキーとしてカラム名を指定しない場合は、テーブルの主キーが使用されます (ある場合)。たとえば、次のCREATE TABLE
ステートメントは MySQL 5.6 で有効です。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)
と同じ効果があります)。この問題の詳細については、セクション19.6「パーティショニングの制約と制限」を参照してください。
注記NDB
ストレージエンジンを使用するテーブルは、テーブルの主キーをパーティショニングキーとして使用して、KEY
によって暗黙的にパーティション化されます。MySQL Cluster テーブルに明示的な主キーがない場合は、NDB
ストレージエンジンによって各 MySQL 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
によってパーティション化された MySQL Cluster テーブルの場合は問題ではありません。そのような場合は、「隠し」主キーをテーブルの新しいパーティショニングキーとして使用してテーブルが再編成されます。第18章「MySQL Cluster NDB 7.3 および MySQL Cluster NDB 7.4」を参照してください。
リニアキーによってテーブルをパーティション化することもできます。次に、単純な例を示します。
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
LINEAR
を使用することは、HASH
パーティショニングの場合と同じ効果が KEY
パーティショニングにあり、パーティショニング番号は法演算ではなく二乗アルゴリズムを使用して導出されます。このアルゴリズムの説明およびその影響については、セクション19.2.4.1「LINEAR HASH パーティショニング」を参照してください。