MRG_MyISAM
エンジンとしても知られている
MERGE
ストレージエンジンは、1
つのものとして使用することができる同一の
MyISAM
テーブルの集まりです。「同一の」というのは、すべてのテーブルが同一のカラムとインデックス情報を持つという意味です。カラムのリストされている順番が違っていたり、カラムが完全に一致していなかったり、インデックスの順番が違っていたりすると
MyISAM
テーブルをマージすることはできません。しかし、すべての
MyISAM
テーブルは
myisampack
で圧縮することができます。詳しくはmyisampackを参照してください。AVG_ROW_LENGTH
、MAX_ROWS
、または
PACK_KEYS
等のようなテーブルオプションの違いは問題ではありません。
MERGE
テーブルを作成するとき、MySQL はディスク上に 2
つファイルを作成します。そのファイル名はテーブル名で始まり、ファイルタイプを指示する拡張子が付きます。.frm
ファイルはテーブルフォーマットを格納し、.MRG
ファイルは 1
つのものとして使用されるべきテーブルの名前を含んでいます。それらのテーブルは、MERGE
テーブルそのものと同じデータベースになくてはならないという訳ではありません。
MERGE
テーブル上では、SELECT
、DELETE
、UPDATE
、そして
INSERT
を利用することができます。MERGE
テーブルにマップする
MyISAM
テーブル上に、SELECT
、UPDATE
、そして
DELETE
権限を持たなければいけません。
MERGE
テーブルの利用は、次のセキュリティーに関する問題を引き起こします。ユーザーが
MyISAM
テーブル
t
にアクセスすることができるとき、そのユーザーは
t
にアクセスすることができる
MERGE
テーブル
m
を作成することができます。しかし、もしユーザーの
t
に対する権限があとで破棄されるなら、m
にアクセスすることで t
にアクセスし続けることができます。
MERGE
テーブルを
DROP
するとき、MERGE
仕様だけが削除されます。基礎テーブルは影響を受けません。
MERGE
テーブルを作成するには、どの
MyISAM
テーブルを 1
つのものとして利用したいかを示す
UNION=(
節を指定しなければいけません。list-of-tables
)MERGE
テーブルに、UNION
リストの最初か最後のテーブルに位置するための挿入が必要であれば、自由に
INSERT_METHOD
オプションを指定することができます。テーブルの最初か最後に挿入されるように、FIRST
か LAST
値をそれぞれ使用してください。INSERT_METHOD
オプションを指定しない場合や、NO
の値で指定した場合は、MERGE
テーブルに行を挿入しようとしてもエラーが発生します。
次の例は、MERGE
テーブルの作成方法を紹介しています。
mysql>CREATE TABLE t1 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>CREATE TABLE t2 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql>INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql>CREATE TABLE total (
->a INT NOT NULL AUTO_INCREMENT,
->message CHAR(20), INDEX(a))
->ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
基礎となっている MyISAM
テーブルの中で、a
カラムは PRIMARY KEY
としてインデックスされていますが、MERGE
テーブルの中ではそうではないことに注意してください。MERGE
テーブルは、基礎となるテーブル全体に一意性を持たせられないため、インデックスは設定されますが、PRIMARY
KEY
としては設定されません。
MySQL 5.1.15
以降のバージョンでは、MERGE
テーブルの一部であるテーブルが開かれるときに次の確認が行われます。もし
1
つでも適合性確認に失敗したら、そのテーブルを開くことはできません。それぞれのテーブルに適応される適合性確認は次のようなものです。
MERGE
テーブルとまったく同じカラム数がなければいけません。
MERGE
テーブルのカラムの順番は、基礎テーブルのカラムの順番と一致する必要があります。
さらに、親 MERGE
テーブルと、基礎テーブルのカラム仕様がそれぞれ比較されます。MySQL
では、それぞれのカラムに対して次のことを確認します。
基礎テーブルのカラムタイプは、MERGE
テーブルのカラムタイプと等しい。
基礎テーブルのカラムの長さは、MERGE
テーブルのカラムの長さと等しい。
基礎テーブルのカラムと
MERGE
テーブルのカラムは
NULL
となり得る。
基礎テーブルは、少なくともマージテーブルと同量のキーを持つ必要がある。基礎テーブルは、MERGE
テーブルよりも多くのキーを持つことはできますが、その反対はできません。
MERGE
テーブルと基礎
MyISAM
テーブルの両方において、一部のカラム上のキーの順序が同じでなければならないという既知の問題があります。Bug#33653 を参照してください。
それぞれのキーに対して
基礎テーブルのキー型がマージテーブルのキー型と等しいかどうかを確認してください。
基礎テーブルのキー定義中のキーパーツ (合成キー内の複数カラム) の数がマージテーブルのキー定義中のキーパーツの数と等しいかどうかを確認してください。
それぞれのキーパーツに対して
キーパーツの長さが等しいかどうかを確認してください。
キーパーツの型が等しいかどうかを確認してください。
キーパーツの言語が等しいかどうかを確認してください。
キーパーツに
NULL
を指定できるかどうかを確認してください。
MERGE
テーブルを作成したあと、テーブルグループに対してまとめて機能するクエリーを発行することができます。
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
MERGE
テーブルを再度別の
MyISAM
テーブルのグループに対してマップするには、次の方法の
1 つを利用することができます。
MERGE
テーブルを
DROP
して、もう一度作成してください。
基礎テーブルのリストを変更するには、ALTER
TABLE
を利用します。
tbl_name
UNION=(...)
MySQL 5.1.24
以降のバージョンでは、ALTER
TABLE ... UNION=()
(空の
UNION
節)
を使用して、基礎テーブルをすべて削除することもできます。(Bug#28248)
MERGE
テーブルは、次のような問題を解決するのに役立ちます。
ログテーブル一式を簡単に処理することができます。たとえば、違う月のデータを別々のテーブルに入力し、myisampack
を利用してそれらを圧縮し、そしてそれらを 1
つのものとして利用するために
MERGE
テーブルを作成することができます。
スピードを上げることができます。大きいリードオンリーのテーブルを、いくつかの基準に基づいて分割し、個々のテーブルを別々のディスク上に置くことができます。このような場合は、MERGE
テーブルを利用した方が、大きいテーブルを利用するより早く処理ができます。
より有効な検索を行うことができます。検索の対象が明らかな場合、いくつかのクエリーを分割されたテーブルのうちの一つだけで実行し、それ以外のものに対しては
MERGE
テーブルを使用します。共通のテーブル一式を利用する、別々の
MERGE
テーブルをいくつも持つこともできます。
より有効な検索を行うことができます。1
つの大きなテーブルを修正するよりも、MERGE
テーブルに位置づけられた個々のテーブルを修正するほうが簡単です。
瞬時にいくつものテーブルを 1
つのものとして位置づけます。MERGE
テーブルは個々のテーブルのインデックスを利用するので、それ自体のインデックスを整備する必要がありません。その結果、MERGE
テーブルの集まりは、作成や最位置づけを大変
速いスピードで行うことができます。(インデックスが何も作成されていないとしても、MERGE
テーブルを作成するときはインデックス定義を指定しなければいけないことを覚えておいてください)。
要求に応じて作成した大きなテーブルにテーブル一式がある場合、それらの代わりに要求に応じた
MERGE
テーブルを作成する必要があります。この方が、ディスクの場所を節約し、すばやく処理することができます。
オペレーティングシステムのファイルサイズ制限を上回ります。1
つ 1 つの MyISAM
テーブルはこの制限に制約されますが、MyISAM
テーブルの集まりは制約されません。
その 1 つのテーブルに位置づける
MERGE
テーブルを定義することによって、MyISAM
テーブルに仮名や同義語を作成することができます。この作業を行うことによって特に顕著なインパクトは現れません。(個々の読み取りに対していくつかの間接的なコールや
memcpy()
コールがあるだけです)。
MERGE
テーブルの不都合な点は次のようなものです。
MERGE
テーブルに対して、同一の
MyISAM
テーブルしか利用することができません。
MERGE
テーブルの中で、いくつもの
MyISAM
フィーチャーを利用することはできません。たとえば、MERGE
テーブル上で FULLTEXT
インデックスを設定することはできません。(もちろん、基礎
MyISAM
テーブル上に
FULLTEXT
インデックスを設定することはできますが、全文検索で
MERGE
テーブルを検索することはできません。
MERGE
テーブルが一時的なものでない場合、基礎
MyISAM
テーブルもすべて一時的でない必要があります。MERGE
テーブルが一時的なものである場合、MyISAM
テーブルは一時的なものと一時的でないものが混在していても構いません。
MERGE
テーブルはより多くのファイル記述子を利用します。10
台のクライアントが、10
個のテーブルにマップする
MERGE
テーブルを使用する場合、サーバーは (10 ×
10) + 10 個のファイル記述子を使用します。(10
個のクライアントに対して 10
個のデータファイル記述子、そして、10
個のインデックスファイル記述子がクライアントの間で共有されます)。
キーの読み込みが遅いです。キーを読み込む際、MERGE
ストレージエンジンは、与えられたキーにどれが一番近いかを確認するために、すべての基礎テーブルに対して読み込みを行う必要があります。次のキーを読み込む際、そのキーを見つけるために
MERGE
ストレージエンジンは、読み込みバッファーを検索する必要があります。1
つのキーバッファーを使い切ったときにかぎり、ストレージエンジンは次のキーブロックを読み込む必要があります。このために
eq_ref
検索の
MERGE
キーが遅くなりますが、ref
検索ほど遅くはありません。eq_ref
と ref
の詳細については項8.3.2. 「EXPLAIN
構文」をご参照ください。
追加情報
MERGE
ストレージエンジンを専門に扱うフォーラム:
http://forums.mysql.com/list.php?93