MRG_MyISAMエンジンとしても知られているMERGE ストレージエンジンは、
一つの物として使用する事ができる同一のMyISAM テーブルの集まりです。
「同一の」というのは、全てのテーブルが同一のカラムとインデックス情報
を持つという意味です。カラムのリストされている順番が違っていたり、
カラムが完全に一致していなかったり、インデックスの順番が違っていたりすると
MyISAM テーブルをマージする事はできません。しかし、全てのMyISAM
テーブルはmyisampackで圧縮する事ができます。
AVG_ROW_LENGTH、 MAX_ROWS、または PACK_KEYS 等のようなテーブル
オプションの違いは問題ではありません。

MERGE テーブルを作成する時、MySQLはディスク上に二つファイルを作成します。
そのファイル名はテーブル名で始まり、ファイルタイプを指示する拡張子が付きます。
.frm ファイルはテーブルフォーマットを格納し、
.MRG ファイルは一つの物として使用されるべきテーブルの名前を含んでいます。

———————————————————————
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:06 Y2008.frm
-rw-rw—- 1 mysql mysql 60 2009-02-24 10:08 Y2008.MYD
-rw-rw—- 1 mysql mysql 3072 2009-02-24 10:08 Y2008.MYI
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:11 Y2008_Y2009.frm
-rw-rw—- 1 mysql mysql 32 2009-02-24 10:11 Y2008_Y2009.MRG
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:09 Y2009.frm
-rw-rw—- 1 mysql mysql 36 2009-02-24 10:22 Y2009.MYD
-rw-rw—- 1 mysql mysql 3072 2009-02-24 10:22 Y2009.MYI
———————————————————————


mysql> CREATE TABLE Y2008 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE UNIQUE INDEX uidx_y2008_comment ON Y2008 (comment);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> INSERT INTO Y2008 (comment) VALUES('comment1');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Y2008 (comment) VALUES('comment2');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Y2008 (comment) VALUES('comment3');
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE Y2009 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE UNIQUE INDEX uidx_y2009_comment ON Y2009 (comment);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> CREATE TABLE Y2008_Y2009 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MERGE UNION=(Y2008,Y2009) INSERT_METHOD=LAST;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> CREATE UNIQUE INDEX uidx_Yyyyy_comment ON Y2008_Y2009(comment);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql>

create_merge

create_merge_status

mysql> select * from Y2008_Y2009;
+—-+———-+
| id | comment |
+—-+———-+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
+—-+———-+
3 rows in set (0.00 sec)

mysql>

create_merge_each_table

mysql> insert into Y2008_Y2009(comment) values(‘INSERT INTO MYISAM MERGE’);

mysql> select * from Y2008_Y2009;
+—-+————————–+
| id | comment |
+—-+————————–+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
| 4 | INSERT INTO MYISAM MERGE |
+—-+————————–+
4 rows in set (0.00 sec)

mysql>

create_merge_insert

mysql> select * from Y2008;
+—-+———-+
| id | comment |
+—-+———-+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
+—-+———-+
3 rows in set (0.00 sec)

mysql> select * from Y2009;
+—-+————————–+
| id | comment |
+—-+————————–+
| 4 | INSERT INTO MYISAM MERGE |
+—-+————————–+
1 row in set (0.00 sec)

mysql>

mrg


mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE from information_schema.tables where table_schema = 'TEST';
+--------------+-------------+------------+------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE |
+--------------+-------------+------------+------------+
| TEST | MEM | BASE TABLE | MEMORY |
| TEST | MEM2 | BASE TABLE | MEMORY |
| TEST | MEM3 | BASE TABLE | MEMORY |
| TEST | MYSQLIMP | BASE TABLE | MyISAM |
| TEST | T1 | BASE TABLE | InnoDB |
| TEST | T2 | BASE TABLE | InnoDB |
| TEST | Y2008 | BASE TABLE | MyISAM |
| TEST | Y2008_Y2009 | BASE TABLE | MRG_MYISAM |
| TEST | Y2009 | BASE TABLE | MyISAM |
+--------------+-------------+------------+------------+
9 rows in set (0.00 sec)

mrg_myisam

MERGEテーブル上では、SELECT、 DELETE、 UPDATE、そして INSERTを
利用する事ができます。MERGE テーブルにマップするMyISAM テーブル上に、
SELECT、 UPDATE、そして DELETE 権限を持たなければいけません。

MERGE テーブルをDROPする時、 MERGE 仕様だけが削除されます。
基礎となるテーブルは影響を受けません。

MERGE テーブルを作成するには、どの MyISAM テーブルを一つの物として利用
したいかを示すUNION=(list-of-tables) 条項を指定しなければいけません。
MERGE テーブルに、 UNION リストの最初か最後のテーブルに位置する
為の挿入が必要であれば、自由に INSERT_METHOD オプションを指定する事が
できます。テーブルの最初か最後に挿入されるように、FIRST か LAST値を
それぞれ使用してください。INSERT_METHOD オプションを指定しない場合や、
NOの値で指定した場合は、MERGEテーブルに行を挿入しようとしてもエラーが発生します。

※オプションとして、MERGE テーブルへの挿入が UNION リスト内の最初のテーブルと最後のテーブル
のどちらで行われるかを、INSERT_METHOD で指定できます。INSERT_METHOD を指定しなかった
場合、または NO を指定した場合は、MERGE テーブルに対するすべての INSERT コマンドでエラーが
返されます。

※MERGE テーブルの中で、いくつものMyISAMフィーチャーを利用する事はできません。
例えば、MERGE テーブル上でFULLTEXT インデックスを作成する事はできません。
(もちろん、基礎となるMyISAM テーブル上に FULLTEXT インデックスを作成する事はできますが、
全文検索で MERGE テーブルを検索する事はできません。

Comments are closed.

Post Navigation