キーによる分割はハッシュによる分割と似ていますが、ハッシュ分割がユーザによって定義された表現を使用するところ、キー分割のハッシュ関数は
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 分割」
を参照してください。
