merge存儲引擎(一)
merge表的問題
merge存儲引擎,也被認識為mrg_myisam引擎,是一個相同的可以被當作一個來用的myisam表的集合。“相同”意味着所有表同樣的列和索引資訊。你不能合并列被以不同順序列于其中的表,沒有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來壓縮。表選項的差異,比如avg_row_length, max_rows或pack_keys都不重要。
當你建立一個merge表之時,mysql在磁盤上建立兩個檔案。檔案名以表的名字開始,并且有一個擴充名來指明檔案類型。一個.frm檔案存儲表定義,一個.mrg檔案包含被當作一個來用的表的名字。這些表作為merge表自身,不必要在同一個資料庫中。
你可以對表的集合用select, delete, update和insert。你必須對你映射到一個merge表的這些表有select, update和delete 的權限。
如果你drop merge表,你僅在移除merge規格。底層表沒有受影響。
當你建立一個merge表之時,你必須指定一個union=(list-of-tables)子句,它說明你要把哪些表當作一個來用。如果你想要對merge表的插入發生在union清單中的第一個或最後一個表上,你可以選擇地指定一個insert_method選項。使用first或last值使得插入被相應地做在第一或最後一個表上。如果你沒有指定insert_method選項,或你用一個no值指定該選項。往merge表插入記錄的試圖導緻錯誤。
下面例子說明如何建立一個merge表:
mysql> create table pay_2009 (
-> id int,
-> pay_date datetime,
-> amount decimal(15,3),
-> key idx_fk_id(id)
-> ) engine=myisam;
query ok, 0 rows affected (0.06 sec)
mysql> create table pay_2010 (
query ok, 0 rows affected (0.13 sec)
mysql> create table pay_all (
-> index (id)
-> ) engine=merge union=(pay_2009,pay_2010) insert_method=first;
query ok, 0 rows affected (0.09 sec)
mysql> insert into pay_2009 values(1,'2009-09-27',10000),(2,'2009-09-17',20000);
query ok, 2 rows affected (0.00 sec)
records: 2 duplicates: 0 warnings: 0
mysql> insert into pay_2010 values(1,'2010-09-27',10000),(2,'2010-09-17',20000);
query ok, 2 rows affected (0.02 sec)
mysql>
注意,一個列在mergen表中被索引,但沒有被宣告為一個primary key,因為它是在更重要的myisam表中。這是必要的,因為merge表在更重要的表中的設定上強制非唯一性。
建立merge表之後,你可以發出把一組表當作一體來操作的查詢:
mysql> select * from pay_2009;
+------+---------------------+-----------+
| id | pay_date | amount |
| 1 | 2009-09-27 00:00:00 | 10000.000 |
| 2 | 2009-09-17 00:00:00 | 20000.000 |
2 rows in set (0.00 sec)
mysql> select * from pay_2010;
| 1 | 2010-09-27 00:00:00 | 10000.000 |
| 2 | 2010-09-17 00:00:00 | 20000.000 |
mysql> select * from pay_all;
4 rows in set (0.00 sec)
mysql> insert into pay_all values(3,'2009-12-02',80000);
query ok, 1 row affected (0.00 sec)
| 3 | 2009-12-02 00:00:00 | 80000.000 |
3 rows in set (0.00 sec)
5 rows in set (0.00 sec)
注意,你也可以直接從mysql之外直接操作.mrg檔案: