MERGE テーブルは、MySQL バージョン
      3.23.25
      で新たに導入されました。コードはまだガンマ版ですが、比較的安定しているはずです。
    
      MERGE
      テーブル(MRG_MyISAM
      テーブルとも呼ばれます)は、1
      つのテーブルとして使用できる同一の
      MyISAM
      テーブルの集合です。テーブルの集合には、SELECT、DELETE、UPDATE
      のみを実行できます。MERGE
      テーブルに対して DROP
      を実行すると、MERGE
      の仕様のみが破棄されます。
    
      WHERE なしで DELETE FROM
      merge_table
      を使用すると、テーブルに対するマッピングのみが消去され、マップされたテーブルの内容は削除されないことに注意してください(これは
      4.1 で修正する予定です)。
    
      同一のテーブルとは、すべてのテーブルが同一のカラムおよびキー情報で作成されていることを意味します。カラムのパック方法が異なるテーブル、保持するカラムがまったく同じでないテーブル、あるいはキーの順序が異なるテーブルはマージできません。ただし、一部のテーブルは
      myisampack で圧縮できます。 See
      項4.8.4. 「myisampack(MySQL
        圧縮読み取り専用テーブルジェネレータ)」。
    
      MERGE
      テーブルを作成すると、.frm
      テーブル定義ファイルおよび .MRG
      テーブルリストファイルが作成されます。.MRG
      には、1
      つのインデックスファイルとして使用される複数のインデックスファイル(.MYI
      ファイル)のリストのみが含まれています。4.1.1
      より前のバージョンでは、使用されるすべてのテーブルを
      MERGE
      テーブルと同じデータベースに配置する必要がありました。
    
      今のところ、MERGE
      テーブルにマップするテーブルに対しては、SELECT、UPDATE、DELETE
      の各特権が必要です。
    
      MERGE
      テーブルには、次のような効果があります。
    
          一連のログテーブルを簡単に管理できる。たとえば、各月のデータを別々のファイルに収録し、それらの一部を
          myisampack
          で圧縮した後に、MERGE
          を作成してそれらを 1
          つのファイルとして使用することができる。
        
          処理速度が速くなる。大きな読み取り専用テーブルをいくつかの基準に基づいて分割し、分割した各部分を別々のディスクに配置できる。この場合、MERGE
          テーブルを作成すれば、大きなテーブルを使用する場合に比べてはるかに処理が速くなる(RAID
          を使用した場合も同じ効果が得られる)。
        
          より効率的に検索できる。処理の対象を正確に把握していれば、一部のクエリに対して分割されたテーブルの
          1 つで検索を行い、その他のクエリに対して
          MERGE
          を使用することができる。多数のさまざまな
          MERGE
          テーブルをアクティブにすることもできる。この場合、ファイルが重複していてもかまわない。
        
          より効率的に修復できる。1
          つの大きなファイルを修復するより、MERGE
          ファイルにマップされたファイルを個別に修復する方が簡単である。
        
          多数のファイルを 1
          つのファイルとして即座にマップできる。MERGE
          テーブルは、個々のテーブルのインデックスを使用する。MERGE
          テーブル独自のインデックスを保持する必要はない。このため、MERGE
          テーブルの集合の作成または再マップにはほとんど時間がかからない。MERGE
          テーブルを作成するときは、キー定義を指定する必要があることに注意する。
        
          一連のテーブルをオンデマンドまたはバッチで大きなテーブルに結合する場合は、代わりにそれらのテーブルに対してオンデマンドで
          MERGE
          テーブルを作成した方がよい。この方が時間がかからず、ディスク領域も大幅に節約できる。
        
オペレーティングシステムのファイルサイズ制限を回避できる。
          1 つのテーブル上で MERGE
          を使用するだけで、テーブルのエイリアス/シノニムを作成できる。これによってパフォーマンスが特に影響を受けることはない(読み取りのたびに数回の間接的な呼び出しと
          memcpy()
          の呼び出しが発生するのみ)。
        
      MERGE
      テーブルの欠点は次のとおりです。
    
          MERGE テーブルには同一の
          MyISAM
          テーブルしか使用できない。
        
          REPLACE を使用できない。
        
          MERGE
          テーブルはより多くのファイル記述子を使用する。10
          個のテーブルをマップする MERGE
          テーブルを 10
          人のユーザが使用している場合は、10 10 + 10
          個のファイル記述子を使用することになる(10
          人のユーザに 10
          個ずつのデータファイルと、10
          個の共有インデックスファイル)。
        
          キーの読み取りが遅い。キーに対して読み取りを行うと、MERGE
          ストレージエンジンは構成要素であるべてのテーブルに対して読み取りを発行して、指定されたキーに最も一致するテーブルをチェックする。その後に
          "read-next" を実行すると、MERGE
          ストレージエンジンは読み取りバッファを検索して次のキーを検出する。1
          つのキーバッファがすべて使われるまでストレージエンジンは次のキーブロックを読み取らない。このため、eq_ref
          検索では MERGE
          キーの処理にかなり時間がかかるが、ref
          検索ではそれほど時間がかからない。 See
          項5.2.1. 「EXPLAIN 構文(SELECT
        に関する情報の取得)」。
        
          "開いている" MERGE
          テーブルによってマップされているテーブルには、DROP
          TABLE、ALTER
          TABLE、WHERE 節なしの
          DELETE FROM table_name、REPAIR
          TABLE、TRUNCATE
          TABLE、OPTIMIZE
          TABLE、または ANALYZE TABLE
          を実行できない。これを実行すると、MERGE
          テーブルが元のテーブルを参照するおそれがあり、予期しない結果を得ることがある。この問題を最も簡単に回避するには、FLUSH
          TABLES コマンドを発行して "開いている"
          MERGE
          テーブルを残さないようにする。
        
      MERGE テーブルを作成するときに、1
      つにまとめたいテーブルを
      UNION=(list-of-tables)
      で指定する必要があります。オプションとして、MERGE
      テーブルへの挿入が UNION
      リスト内の最初のテーブルと最後のテーブルのどちらで行われるかを、INSERT_METHOD
      で指定できます。INSERT_METHOD
      を指定しなかった場合、または NO
      を指定した場合は、MERGE
      テーブルに対するすべての INSERT
      コマンドでエラーが返されます。
    
      次の例は、MERGE
      テーブルの使い方を示しています。
    
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT, message CHAR(20), KEY(a))
             TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
SELECT * FROM total;
      total
      テーブルではキーが一意にならないため、このテーブルでは
      UNIQUE または PRIMARY KEY
      を作成していないことに注意してください。
    
      MySQL サーバの外部から直接 .MRG
      ファイルを操作することもできます。
    
shell>cd /mysql-data-directory/current-databaseshell>ls -1 t1.MYI t2.MYI > total.MRGshell>mysqladmin flush-tables
これで次のような操作を実行できるようになります。
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+
      注意: a カラムは、PRIMARY
      KEY
      として宣言されていますが、実際には一意ではないことに注意してください。MERGE
      テーブルでは、これを構成する一連の
      MyISAM
      テーブル全体にわたる一意性を確保できないからです。
    
      MERGE
      テーブルをマップし直すには、次のいずれかの操作を実行します。
    
          テーブルに対して DROP
          を実行し、テーブルを再作成する。
        
          ALTER TABLE table_name UNION=(...)
          を使用する。
        
          .MRG
          ファイルを変更し、MERGE
          テーブルとこれを構成するすべてのテーブルに対して
          FLUSH TABLE
          を発行することで、ストレージエンジンが新しい定義ファイルを読み取るようにする。
        
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

