merge存储引擎基本介绍和使用规范说明

【以下两段截自MySql手册】

  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表插入记录的试图导致错误。

 
MRG_MyISAM存储引擎为MySQL的其中一个存储引擎,使用下面语句察看MYSQL数据库是否支持该存储引擎。


mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                       | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                         | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                            | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                        | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                            | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

      先创建子表,结构与主表相同,在创建子表时注意要将engine=mrg_myisam(或engine=merge)替换为engine=myisam,否则会出现Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist的错误提示,不能对主表进行查询

 

使用案例:

 

CREATE TABLE IF NOT EXISTS `user1` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`name` varchar(50) DEFAULT NULL,  
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
CREATE TABLE IF NOT EXISTS `user2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
INSERT INTO `user1` (`name`) VALUES('lisi');
  
INSERT INTO `user2` (`name`) VALUES('zhangsan');
 
CREATE TABLE IF NOT EXISTS `uUser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
INDEX(id)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1;
 
select id,name from uUser;
+----+--------+
| id | name   |
+----+--------+
|  1 | lisi  |
|  1 | zhangsan  |
+----+--------+
2 rows in set (0.00 sec)
 
mysql> INSERT INTO `uUser` (`name`) VALUES('lilei');
  
mysql> select id, name from user2
 -> ;  
+----+-------+
| id | name  |
+----+-------+
|  1 | zhangsan |
|  2 | lilei |
+----+-------+
2 rows in set (0.00 sec)  

  因为uUser INSERT_METHOD=LAST  ,所以在往uUser insert 其实是往 UNION=(user1,user2) 中最后一个即user2中insert 数据。

        
 
 
posted @ 2019-08-05 09:48  夏天换上冬装  阅读(681)  评论(0编辑  收藏  举报