天天看点

【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文件: