キーによるパーティショニングはハッシュによるパーティショニングと似ていますが、ハッシュパーティショニングがユーザによって定義された表現を使用するところ、キーパーティショニングのハッシュ関数は
MySQL サーバによって提供されます。MySQL
クラスタはこのために MD5()
を使用します。他のストレージエンジンを使用しているテーブルには、サーバは自身の
PASSWORD()
アルゴリズムに基づいた内部ハッシュ関数を使用します。
CREATE TABLE ... PARTITION BY KEY
の構文ルールは、ハッシュによってパーティショニングされたテーブルを作成するものと類似しています。最大の相違点は
HASH よりも KEY が使用されることにあります。
KEY は 1
以上のカラム名のみとります。MySQL
5.1.5に始まり、パーティショニングキーとして使用されるカラムはテーブルのプライマリキーの一部もしくは前部を構成しなければいけません。これは、テーブルにプライマリキーがある場合のみです。
MySQL 5.1.6に始まり、KEY は 0
以上のカラム名をとります。パーティショニングキーとしてカラム名が特定されていない場合、存在する場合に限ってテーブルのプライマリキーが使用されます。たとえば、以下の
CREATE TABLE
ステートメントはMySQL 5.1.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;
他のパーティショニングの種類が指定された場合、先のステートメントは有効
ではありません。(注:この場合、単純に
PARTITION BY KEY()
を使用すれば、有効である上 PARTITION
BY KEY(s1)
と同等の効果となります。これは、s1
がテーブルのプライマリキーとなるからです。
この件の詳細については 項15.5. 「パーティショニングの制約と制限」 を参照してください。
注:MySQL
5.1.6に始まり、NDB Cluster
ストレージエンジンを使用しているテーブルは、テーブルのプライマリキーをパーティショニングキーとして、KEY
によって暗黙にパーティショニングされています。クラスタテーブルに明確にプライマリキーがない場合、各クラスタテーブルの
NDB
ストレージエンジンによって生成された
「hidden」
プライマリキーがパーティショニングキーとして使用されます。
重要NDB
Cluster 以外のMySQLストレージ
エンジンを使用しているキーパーティショニングされたテーブルは、ALTER
TABLE DROP PRIMARY KEY
を実行することができません。なぜなら、実行した場合は以下のエラーテキストが現れるからです:ERROR
1466 (HY000): Field in list of fields for partition function
not found in
table。これは KEY によってパーティショニングされたMySQLクラスタテーブルにとっては問題になりません。その場合、「hidden」プライマリキーをテーブルの新しいパーティショニングキーとしてテーブルが再構築されます。章 14. MySQL Cluster
を参照してください。
リニアキーを使用してテーブルをパーティショニングすることもできます。ここに単純な例を記します。
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
LINEAR を使用するのは
KEY
パーティショニングに対しても
HASH
パーティショニングに対しても同様の効果をもたらします。この時パーティショニングはモジュロ算術よりも二乗アルゴリズムを使用してパーティショニング番号が派生されます。アルゴリズムとその意味合いについては、
項15.2.3.1. 「LINEAR HASH パーティショニング」
を参照してください。
