【转】Mysql MERGE引擎简介

标签: mysql merge 引擎 | 发表时间:2013-11-16 00:21 | 作者:MaxOmnis
出处:http://www.iteye.com

http://blog.csdn.net/qmhball/article/details/7499432

 

一. 什么是MERGE 引擎
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。

二. 应用场景
如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效。

 

三. 举例
假设有如下两表

[sql]  view plain copy
 
  1. CREATE TABLE `t1` (     
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,     
  3. `log` varchar(45) ,     
  4. PRIMARY KEY (`id`)   
  5. ) ENGINE=MyISAM;  
[sql]  view plain copy
 
  1. CREATE TABLE `t2`(     
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,     
  3. `log` varchar(45) ,     
  4. PRIMARY KEY (`id`)   
  5. ) ENGINE=MyISAM;  

假设t1,t2中都有如下记录

+----+-------+

| id | log   |

+----+-------+

|  1 | test1 |

|  2 | test2 |

|  3 | test3 |

+----+-------+

建立MERGE表

[sql]  view plain copy
 
  1. CREATE TABLE `t` (     
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,     
  3. `log` varchar(45) NOT NULL,     
  4. PRIMARY KEY (`id`)   
  5. ) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;  

执行select * from t;将会得到如下结果
+----+-------+
| id | log   |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
|  1 | test1 |
|  2 | test2 |
|  3 | test3|
+----+-------+

从效果上看,t1,t2的记录如同在一张表里一样被罗列了出来。当然,看了这个结果你一定会有一些疑问,在下一节里我们会慢慢解释。现在我们主要来解释一下上面MERGE表的建表语句。
1)ENGINE=MERGE
指明使用MERGE引擎,有些同学可能见到过ENGINE=MRG_MyISAM的例子,也是对的,它们是一回事。
2)UNION=(t1, t2)
指明了MERGE表中挂接了些哪表,可以通过alter table的方式修改UNION的值,以实现增删MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。
4)MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。

四. Cookie问答
1)建表时UNION指明的子表如果存在相同主键的记录会怎么样?
相同主键的记录会同时存在于MERGE中,就像第三节中的例子所示。但如果继续向MERGE表中插入数据,若数据主键已存在则无法插入。换言之,MERGE表只对建表之后的操作负责。

2)若MREGE后存在重复主键,按主键查询会是什么结果?
顺序查询,只出现一条查询记录即停止。比如第三节中的例子,如果执行

[sql]  view plain copy
 
  1. select * from t where id=1;  


只会得到结果
+----+--------+
| id | log    |
+----+--------+
|  1 | test1  |
+----+--------+

 

3)直接删除一个子表会出现什么情况,正确删除的方式是怎样的?
MERGE表会被破坏,正确方式是用alter table方式先将子表从MERGE表中去除,再删除子表。
以第三节中的例子为例,执行如下操作

[sql]  view plain copy
 
  1. alter table t ENGINE=MRG_MyISAM UNION=(t1) INSERT_METHOD=LAST;  


可以从MERGE表中去除t2,这里你可以安全的对t2进行任何操作了。

 

4)误删子表时,如何恢复MERGE表?
误删子表时,MERGE表上将无法进行任何操作。
方法1,drop MERGE表,重建。重建时注意在UNION部分去掉误删的子表。
方法2,建立MERGE表时,会在数据库目录下生成一个.MRG文件,比如设表名为t,则文件名为t.MRG。
文件内容类似:
t1
t2
#INSERT_METHOD=LAST
指明了MGEGE表的子表构成及插入方式。
可以直接修改此文件,去掉误删表的表名。然后执行flush tables即可修复MERGE表。

 

5)MERGE的子表中之前有记录,且有自增主键,则MERGE表创建后,向其插入记录时主键以什么规则自增?
以各表中的AUTO_INCREMENT最大值做为下一次插入记录的主键值。
比如t1的自增ID至6,t2至4,则创建MERGE表后,插入的下一条记录ID将会是7

 

6)两个结构完全相同的但已存在数据的表,是否一定可以合成一个MEREGE表?
从实验的结果看,不是这样的,有时创建出的表,无法进行任何操作。
所以,推荐的使用方法是先有一个MERGE表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如200w)时,创建另一张空表,将其挂入MERGE表,然后继续插入记录。

 

7)删除MERGE表是否会对子表产生影响?
不会

 

8)MREGE表的子表的ENGIN是否有要求?
有的,必须是MyISAM表

 

附:
官方给出的关于MERGE表存在的一些问题
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#merge-table-problems
如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [mysql merge 引擎] 推荐:

【转】Mysql MERGE引擎简介

- - 编程语言 - ITeye博客
一. 什么是MERGE 引擎. MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询. 如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效. 执行select * from t;将会得到如下结果.

mysql-merge合并表

- - CSDN博客编程语言推荐文章
注意: 1 每个子表的结构必须一致,主表和子表的结构需要一致, 2 每个子表的索引在merge表中都会存在,所以在merge表中不能根据该索引进行唯一性检索. 3 子表需要是MyISAM引擎 4 AUTO_INCREMENT 不会按照你所期望的方式工作. 建表语句 create table tablename(正常的字段)engine=merge insert_method=last insert_method: 有两个值如下: LAST 如果你执行insert 指令来操作merge表时,插入操作会把数据添加到最后一个子表中.

【分布式系统工程实现】Bigtable Merge-Dump存储引擎

- XiaoHui - NOSQL Notes
单机存储引擎解决单机读写问题,Merge-Dump存储引擎设计成一种通用的存储引擎,同时支持数据写入,随机读取和顺序扫描功能. 顺序扫描功能应用很广,比如MapReduce批处理,同一个广告主的所有关键词广告统计,用户浏览所有的收藏信息,淘宝卖家管理大量的商品等. 简单的KV系统只需要支持随机读取,而类似Bigtable这样的通用表格系统需要考虑基于主键的顺序扫描功能.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.

试用mysql的infobright引擎

- - 博客园_首页
     换了新的单位我现在也从oracle从业者变成了mysql从业者,当然放弃oracle的原因主要是因为在新单位可以尽量少的写代码了.      现在我面对的是一个数据仓库,和上一家公司一样,数据仓库最让我们技术人员受不鸟的是数据量太大,存储,I/O,效率都让人想死,每次有些统计分析要求,在清单表里查询简直是让我等到花儿都谢了.

MySQL 5.1安装InnoDB引擎

- - Gsion&apos;s Blog
安装 innodb 引擎(mysql5.1默认不安装). 可以在编译安装时,在configrue的时候,加上--with-plugins=innobase这个参数. 如果之前已经安装过,也可补装innodb引擎. 首先确定,在mysql的'plugin_dir'下有ha_innodb_plugin.so和ha_innodb.so两个文件.

MySQL Innodb 存储引擎参数优化

- jinbiaozhao - 服务器运维与网站架构|Linux运维|互联网研究
InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读. 这些特色增加了多用户部署和性能. 没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间.

[MySQL] 浅谈InnoDB存储引擎

- - CSDN博客数据库推荐文章
InnoDB是事务安全的存储引擎,设计上借鉴了很多Oracle的架构思想,一般而言,在OLTP应用中,InnoDB应该作为核心应用表的首先存储引擎. InnoDB是由第三方的Innobase Oy公司开发,现已被Oracle收购,创始人是Heikki Tuuri,芬兰赫尔辛基人,和著名的Linux创始人Linus是校友.

MySQL 預設儲存引擎: InnoDB 介紹

- - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
MySQL 是一套眾所皆知的 Database System,今天來簡介 InnoDB 儲存引擎,在 MySQL 5.5.5 之前預設的儲存引擎是 MyISAM,但是為什麼在 5.5 之後官方要將預設儲存引擎換成 InnoDB 呢. 開始升級伺服器,一起體驗 InnoDB 的功能,如果已經上線很久的網站,作者不建議轉換,因為可能會遇到很多雷.