このセクションでは MySQL 5.1 パーティショニングの概要のコンセプト説明を提供しています。
パーティショニングの制限またはフィーチャーされている限界については 項15.5. 「パーティショニングの制約と制限」 を参照してください。
SQL
基準は実際のデータ保存に関するガイダンスをあまり提供していません。SQL
言語自体、スキーマ、テーブル、行、そしてカラム等の基盤となるデータ構造やメディアとは独立して作動することを目的としています。それにもかかわらず、進んでいるデータベースマネージメントシステムのほとんどが何らかの方法を使ってファイルシステム、ハードウェア、もしくはその両方において特定のデータを保存するための実際のロケーションを決定づける手段を発展させてきました。MySQL
では、InnoDB
ストレージエンジンはテーブルスペースの概念をサポートしてきました。MySQL
サーバも、パーティショニングが可能になる前から異なる実際のディレクトリを指定して異なるデータベースの保存を行うようコンフィギャすることが可能でした。(方法に関しては、項6.6.1. 「シンボリックリンクの使用」
を参照してください)
Partitioningはこの概念を進化させたもので、必要に応じて大まかに設定したルールに従い、各々のテーブルの一部分をファイルシステム上で分布することを可能にしています。結果的に、テーブルの異なる一部分は異なるテーブルとして別々のロケーションに保存されます。データのパーティショニングをとりおこなうユーザによって選択されたルールは関数
と呼ばれ、 MySQL
では係数、レンジや値のリストに対する照合、内部ハッシュファンクション、もしくはリニアハッシュファンクションになります。関数はユーザによって指定されたパーティショニングの種類によって選択され、ユーザによって提供された表現の値をパラメータとして取り入れます。この表現は整数カラム値、もしくは一つまたは複数のカラム値に対して働く関数が整数を返していることが考えられます。この表現の値はパーティショニング関数へ渡され、その特定のレコードが記憶されるべきパーティションを示す整数値を返します。この関数はコンスタントでもランダムであってもいけません。クエリを含んでいないかもしれませんが、実質MySQL上有効などのSQL表現も使用可能です。ただし、MAXVALUE
(可能な最大のポジティブ整数)未満のポジティブ整数を返す表現である必要があります。パーティショニング関数の例はこの章の後部に登場するパーティショニング種類のディスカッション(
項15.2. 「パーティショニングのタイプ」
を参照してください)のほかに、パーティショニング構文の記述に含まれています(項12.1.8. 「CREATE TABLE
構文」
を参照してください)。
これは 水平パーティショニング — と称されていて、テーブル内の異なる行が異なる実際のパーティショニングに割り当てられることが有ります。MySQL 5.1 は、テーブル内の異なるカラムが実際に異なるパーティショニングに割り当てられる、垂直パーティショニング をサポートしていません。現在、垂直パーティショニングをMySQL 5.1に組み込む予定はありません。
パーティショニングのサポートはMySQL
5.1の-max
版に含まれています(つまり、5.1
-max
バイナリは--with-partition
で構築されます。MySQL
バイナリがパーティショニングサポートで構築されている場合、有効化するための追加作業は必要ありません(例えば、my.cnf
ファイルへの特殊エントリーは要求されません。)ユーザのMySQLサーバがパーティショニングをサポートしているか否かは、以下のようなSHOW
VARIABLES
コマンドを使用して確認することができます。
mysql> SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
1 row in set (0.00 sec)
妥当な SHOW VARIABLES
の出力上に上記のように YES
値が
have_partitioning
変数と現れない場合、ユーザの MySQL
はパーティショニングをサポートしていません。
MySQL
5.1.6以前では、この変数はhave_partition_engine
と名づけられていました。(Bug#16718)
パーティショニングされたテーブルを作成するには、MySQLサーバにサポートされるほとんどの記憶エンジンを使用することができます。MySQLパーティショニングエンジンは別の層で作動しており、これらのどのエンジンとも対話できます。MySQL
5.1では、同じパーティショニングされたテーブルのパーティショニングは同じ記憶エンジンを使用していなければいけません。例えば、MyISAM
を1つのパーティションに使い、別のパーティションにInnoDB
を使用することはできません。ただし、同じMySQLサーバもしくは同じデータベース上で異なるパーティショニングされたテーブルに異なる記憶エンジンを使用することを阻むものはありません。
注:MySQL
パーティショニングはMERGE
もしくはCSV
記憶エンジンと使うことはできません。MySQL
5.1.15に始まり、FEDERATED
テーブルもパーティショニングできません
(Bug#22451)。MySQL
5.1.6より前では、BLACKHOLE
記憶エンジンを使用してパーティショニングされたテーブルを作ることは不可能でした
(Bug#14524)。KEY
を使用してのパーティショニングは
NDBCluster
記憶エンジンを使用することでサポートされていますが、MySQL
5.1
内のクラスタテーブルでは他の種類のユーザによって定義されるパーティショニングはサポートされません。
パーティショニングテーブルに特定の記憶エンジンを使用するには、非パーティショニングされたテーブルでそうするように[STORAGE]
ENGINE
のみ使用する必要があります。ただし、[STORAGE]
ENGINE
(と他のテーブルオプション)
はパーティショニングオプションがCREATE
TABLE
ステートメントで使用される前に記述される必要があります。この例はハッシュを使って6のパーティショニングに分けられ、InnoDB
記憶エンジンを使用しているテーブルの作成方法を示しています。
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) ENGINE=INNODB PARTITION BY HASH( MONTH(tr_date) ) PARTITIONS 6;
(各 PARTITION
節は [STORAGE]
ENGINE
オプションを含むことはできますが、MySQL
5.1 では効果がありません。)
注:パーティショニングはテーブルの全データとインデックスに対して適用されます。インデックスのみ、またはvice versaテーブルの1部分のみをパーティショニングすることはできません。
各パーティションのデータやインデックスは、パーティショニングされたテーブル作成のために使用されるCREATE
TABLE
ステートメントの partitioning
節のDATA DIRECTORY
とINDEX
DIRECTORY
オプションを使用して、特定のディレクトリに割り当てることができます。それに加え、MAX_ROWS
とMIN_ROWS
は各パーティショニングに記憶可能な最大と最低の数値を割り出すことができます。これらのオプションについては、項15.3. 「パーティショニング管理」
を参照してください。
パーティショニングの利点にはこういったものが含まれます。
1つのディスクもしくはファイルシステムのパーティションで記憶できる量よりも多くのデータをテーブルで記憶することができます。
有用性を失うデータはそのデータのみを含んでいるパーティションを消去することでテーブルから取り除くことができます。また逆に、新しいデータを追加するプロセスは、そのデータ特有のパーティションを用意することで大きく援助することができるケースがあります。
ある特定のWHERE
節を満たすデータがが1つまたは1つ以上のパーティションのみで記憶されることによって、いくつかのクエリは最適化されます。これにより、検索から残りのパーティションを除外します。パーティショニングされたテーブル作成後にパーティショニングを変更できるため、パーティショニングスキームが最初に設定された当初は現れなかった頻繁なクエリを促進させるためにデータを再編成することができます。この機能は
パーティションの刈り込み
とも呼ばれており、MySQL
5.1.6で実装されました。追加情報に関しては
項15.4. 「パーティションの刈り込み」
を参照してください。
他のパーティショニングによるベネフィットが次のリストの記述されています。これらの特徴は現MySQLパーティショニングには実装されていませんが、優先事項のトップにあります。
SUM()
や COUNT()
といった集約関数を含むクエリは、簡単に並列化させることができます。そのようなクエリの単純な例:SELECT
salesperson_id, COUNT(orders) as order_total FROM sales GROUP
BY
salesperson_id;
.「並列化」とは、各パーティションで同時にクエリを作動させることが可能で、且つ最終結果は全パーティションの結果の合計として取得することができるという意味を含んでいます。
複数のディスク上でデータシークを広めるために、さらに優れたクエリ処理能力を取得できます。
パーティショニングの開発は続いていますので、引き続きこのセクションと章をチェックしてください。