MERGEテーブルについて調査していて、新しい事実が発覚。
以下のSQLに注目。
CREATE DATABASE merge_test;
USE merge_test;
CREATE TABLE item2006 (
id integer PRIMARY KEY AUTO_INCREMENT,
title character varying(64) NOT NULL
);
CREATE UNIQUE INDEX u_idx_item_title ON item2006 (title);
INSERT INTO item2006 (title) VALUES('title1');
INSERT INTO item2006 (title) VALUES('title2');
INSERT INTO item2006 (title) VALUES('title3');
INSERT INTO item2006 (title) VALUES('title4');
CREATE TABLE item2007 (
id integer PRIMARY KEY AUTO_INCREMENT,
title character varying(64) NOT NULL
);
CREATE UNIQUE INDEX u_idx_item_title ON item2007 (title);
CREATE TABLE item (
id integer PRIMARY KEY AUTO_INCREMENT,
title character varying(64) NOT NULL
) TYPE=MERGE UNION=(item2006,item2007) INSERT_METHOD=LAST;
CREATE UNIQUE INDEX u_idx_item_title ON item (title);
特にMERGEテーブル作成時のUNION、INSERT_METHODに注目。
UNION=(item2006,item2007) INSERT_METHOD=LAST
SELECT時、UNIONで囲われた先頭のテーブルから検索を開始し、
結果が得られた時にSELECTが終了する。
ということは、最新のデータを取得することが多いテーブルでは、
UNION=(item2007,item2006) INSERT_METHOD=LAST
の方が効率が良い。
しかし、INSERT_METHOD=LASTが原因で、このままだとitem2006テーブルに
データが登録されてしまう。そこで、
UNION=(item2007,item2006) INSERT_METHOD=FIRST
と定義することで、UNIONの最初に定義したテーブルにINSERTを行う。
で、最終的なMERGEテーブルは、
CREATE TABLE item ( id integer PRIMARY KEY AUTO_INCREMENT, title character varying(64) NOT NULL ) TYPE=MERGE UNION=(item2007,item2006) INSERT_METHOD=FIRST; CREATE UNIQUE INDEX u_idx_item_title ON item (title);
となる。
実際にINSERT,SELECTを行なうと理解できる。
mysql> INSERT INTO item (title) VALUES('title5');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO item (title) VALUES('title6');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM item;
+----+--------+
| id | title |
+----+--------+
| 5 | title5 |
| 6 | title6 |
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |
| 4 | title4 |
+----+--------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM item2007;
+----+--------+
| id | title |
+----+--------+
| 5 | title5 |
| 6 | title6 |
+----+--------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM item2006;
+----+--------+
| id | title |
+----+--------+
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |
| 4 | title4 |
+----+--------+
4 rows in set (0.00 sec)
item2007テーブルにデータが登録されているし、
idが5,6を先にSELECTしてるっぽい。
完璧。

