[MySQL]MERGEテーブル検証(テクニック編)


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してるっぽい。
完璧。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">

Comments links could be nofollow free.