MRG_MyISAM
エンジンとしても知られている MERGE
ストレージエンジンは、1 つのテーブルとして使用できる同一の MyISAM
テーブルの集まりです。「同一の」というのは、すべてのテーブルが同一のカラムとインデックス情報を持つという意味です。カラムが異なる順番でリストされていたり、完全に同じカラムでなかったり、インデックスの順番が違っていたりすると MyISAM
テーブルをマージできません。しかし、MyISAM
テーブルのすべてまたはいずれかを myisampack で圧縮できます。セクション4.6.5「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。AVG_ROW_LENGTH
、MAX_ROWS
、PACK_KEYS
などのテーブルオプションの違いは問題ではありません。
MERGE
テーブルに代わるものはパーティション化されたテーブルであり、1 つのテーブルのパーティションを別々のファイルに格納します。パーティション化によって、一部の操作がより効率的に実行でき、MyISAM
ストレージエンジンに制限されません。詳細については、第19章「パーティション化」を参照してください。
MERGE
テーブルを作成するときに、MySQL はディスク上に 2 つファイルを作成します。そのファイル名はテーブル名で始まり、ファイルタイプを示す拡張子が付きます。.frm
ファイルはテーブルフォーマットを格納し、.MRG
ファイルは 1 つのテーブルとして使用すべき基礎 MyISAM
テーブル名を含みます。これらのテーブルは、MERGE
テーブルと同じデータベースにある必要はありません。
MERGE
テーブルでは、SELECT
、DELETE
、UPDATE
、および INSERT
を使用できます。MERGE
テーブルにマッピングする MyISAM
テーブルに対して SELECT
、DELETE
、および UPDATE
権限が必要です。
MERGE
テーブルの利用は、次のセキュリティーに関する問題を引き起こします。ユーザーが MyISAM
テーブル t
に対するアクセス権限を持っていると、そのユーザーは t
にアクセスできる MERGE
テーブル m
を作成できます。しかし、t
に対するユーザーの権限があとで破棄された場合、ユーザーは m
を介してアクセスすることで t
にアクセスを続けることができます。
DROP TABLE
を MERGE
テーブルに使用すると、MERGE
指定だけが削除されます。基礎テーブルは影響を受けません。
MERGE
テーブルを作成するには、どの MyISAM
テーブルを使用するかを示す UNION=(
オプションを指定する必要があります。オプションとして、list-of-tables
)INSERT_METHOD
オプションを指定して MERGE
テーブルへの挿入方法を制御できます。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;
カラム a
は PRIMARY KEY
として基礎 MyISAM
テーブルではインデックスが付けられていますが、MERGE
テーブルではインデックスが付けられていません。MERGE
テーブルは基礎テーブルセットに一意性を適用できないため、インデックスは設定されますが、PRIMARY KEY
としては設定されません。(同様に、基礎テーブルで UNIQUE
インデックスを持つカラムには、MERGE
テーブルでインデックスが付けられますが、UNIQUE
インデックスとしては付けられないはずです。)
MERGE
テーブルを作成したあと、このテーブルを使用して、テーブルのグループにまとめて操作を行うクエリーを発行できます。
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
MERGE
テーブルを MyISAM
テーブルの別のコレクションに対して再マッピングするには、次のいずれかの方法を利用できます。
MERGE
テーブルをDROP
して、再作成する。-
基礎テーブルのリストを変更するために、
ALTER TABLE
を利用する。tbl_name
UNION=(...)ALTER TABLE ... UNION=()
(つまり、空のUNION
句) を使用してすべての基礎テーブルを削除することもできます。ただしこの場合、テーブルは実質的には空であり、新しい行を取得する基礎テーブルがないために挿入は失敗します。このようなテーブルは、新しいMERGE
テーブルをCREATE TABLE ... LIKE
で作成するためのテンプレートとして役立つ場合があります。
基礎テーブルの定義とインデックスは、MERGE
テーブルの定義と厳密に一致する必要があります。一致がチェックされるのは、MERGE
テーブルが作成されたときではなく、MERGE
テーブルの一部のテーブルが開いたときです。いずれのテーブルも一致チェックに失敗した場合、テーブルのオープンをトリガーした操作は失敗します。すなわち、MERGE
内のテーブルの定義を変更すると、MERGE
テーブルがアクセスされたときに失敗の原因となる可能性があります。それぞれのテーブルに適用される一致チェックは次のとおりです。
基礎テーブルと
MERGE
テーブルのカラム数は同じでなければいけません。基礎テーブルと
MERGE
テーブルのカラムの順番は一致する必要があります。-
また、親の
MERGE
テーブル内の対応する各カラムの指定と基礎テーブルの指定を比較して、次のチェック内容を満たす必要があります。基礎テーブルと
MERGE
テーブルのカラムの型は一致する必要がある。基礎テーブルと
MERGE
テーブルのカラムの長さは一致する必要がある。基礎テーブルと
MERGE
テーブルのカラムはNULL
でもかまわない。
-
基礎テーブルは、少なくとも
MERGE
テーブルと同じ数のインデックスを持つ必要がある。基礎テーブルのインデックスの数はMERGE
テーブルより多くてもかまわないが、少なくすることはできない。注記同じカラムのインデックスは、
MERGE
テーブルと基礎MyISAM
テーブルの両方でまったく同じ順番でなければならないという、既知の問題が存在します。バグ #33653 を参照してください。各インデックスは次のチェック内容を満たす必要があります。
基礎テーブルと
MERGE
テーブルのインデックスの型は一致する必要がある。基礎テーブルと
MERGE
テーブルのインデックス定義でのインデックス部の数 (すなわち、複合インデックス内に複数のカラム) は一致する必要があります。-
各インデックス部について。
インデックス部の長さは同じでなければいけない。
インデックス部の型は同じでなければいけない。
インデックス部の言語は同じでなければいけない。
インデックス部が
NULL
でかまわないかどうかをチェックする。
MERGE
テーブルが基礎テーブルの問題のために、開いたり使用したりできない場合、CHECK TABLE
は問題の原因となったテーブルに関する情報を表示します。
追加のリソース
MERGE
ストレージエンジンに特化したフォーラムは、https://forums.mysql.com/list.php?93で参照できます。