Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


15.7 MERGE ストレージエンジン

MRG_MyISAM エンジンとしても知られている MERGE ストレージエンジンは、1 つのテーブルとして使用できる同一の MyISAM テーブルの集まりです。同一のというのは、すべてのテーブルが同一のカラムとインデックス情報を持つという意味です。カラムが異なる順番でリストされていたり、完全に同じカラムでなかったり、インデックスの順番が違っていたりすると MyISAM テーブルをマージできません。しかし、MyISAM テーブルのすべてまたはいずれかを myisampack で圧縮できます。セクション4.6.5「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。AVG_ROW_LENGTHMAX_ROWSPACK_KEYS などのテーブルオプションの違いは問題ではありません。

MERGE テーブルに代わるものはパーティション化されたテーブルであり、1 つのテーブルのパーティションを別々のファイルに格納します。パーティション化によって、一部の操作がより効率的に実行でき、MyISAM ストレージエンジンに制限されません。詳細については、第19章「パーティション化を参照してください。

MERGE テーブルを作成するときに、MySQL はディスク上に 2 つファイルを作成します。そのファイル名はテーブル名で始まり、ファイルタイプを示す拡張子が付きます。.frm ファイルはテーブルフォーマットを格納し、.MRG ファイルは 1 つのテーブルとして使用すべき基礎 MyISAM テーブル名を含みます。これらのテーブルは、MERGE テーブルと同じデータベースにある必要はありません。

MERGE テーブルでは、SELECTDELETEUPDATE、および INSERT を使用できます。MERGE テーブルにマッピングする MyISAM テーブルに対して SELECTDELETE、および UPDATE 権限が必要です。

注記

MERGE テーブルの利用は、次のセキュリティーに関する問題を引き起こします。ユーザーが MyISAM テーブル t に対するアクセス権限を持っていると、そのユーザーは t にアクセスできる MERGE テーブル m を作成できます。しかし、t に対するユーザーの権限があとで破棄された場合、ユーザーは m を介してアクセスすることで t にアクセスを続けることができます。

DROP TABLEMERGE テーブルに使用すると、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;

カラム aPRIMARY 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 は問題の原因となったテーブルに関する情報を表示します。

追加のリソース


User Comments
  Posted by Edwin DeSouza on July 26, 2010
  Posted by Mustali Kachwala on August 25, 2011
  Posted by Marek Grossman on December 11, 2012
Re to: Edwin DeSouza
> Using MySQL Partitioning Instead of MERGE Tables
A Partitioning and the Merge tables are not the same!
You can decide to be better use the Merge for better performance.

For example:
Merge - seaching the underlayed tables in order as tables are in UNION list definition, when find needed record stop searching.
IMHO it's good for two tables : actual and archive data TBs.

Partitioning - can effectively "cut off" not relevant "underlayed" files - not searching thru all data files - only if SELECT-WHERE condition is with column whitch is used in PARTITION BY RANGE condition.

Before You decide to use Merge or Partitioning read some comparsion.
Sign Up Login You must be logged in to post a comment.