天天看點

【Mysql 學習】MERGE存儲引擎(一)

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檔案: