MySQL MERGE存储引擎 简介及用法

 

MERGE存储引擎把一组MyISAM数据表当作一个逻辑单元来对待,让咱们能够同时对他们进行查询。构成一个MERGE数据表结构的各成员MyISAM数据表必须具备彻底同样的结构。每个成员数据表的数据列必须按照一样的顺序定义一样的名字和类型,索引也必须按照一样的顺序和一样的方式定义。mysql

假设你有几个日志数据表,他们内容分别是这几年来每年的日志记录项,他们的定义都是下面这样,YY表明年份:sql

 

CREATE TABLE log_YY  数据库

(  缓存

  dt  DATETIME NOT NULL,  工具

  info VARCHAR(100) NOT NULL,  post

  INDEX (dt)  性能

) ENGINE = MyISAM;  大数据

 

假设日志数据表的当前集合包括 log_200四、log_200五、log_200六、log_2007 ,而你能够建立一个以下所示的MERGE数据表把他们归拢为一个逻辑单元:优化

 

CREATE TABLE log_merge  spa

(  

    dt DATETIME NOT NULL,  

    info VARCHAR(100) NOT NULL,  

    INDEX(dt)  

) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007);  


ENGINE选项的值必须是MERGE,UNION选项列出了将被收录在这个MERGE数据表离得各有关数据表。把这个MERGE建立出来后,就能够像对待任何其余数据表那样查询它,只是每一次查询都将同时做用与构成它的每个成员数据表 。下面这个查询可让咱们知道上述几个日志数据表的数据行的总数:

 

 

SELECT COUNT(*) FROM log_merge;  


下面这个查询用来肯定在这几年里每一年各有多少日志记录项:

 

 

SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y;  


除了便于同时引用多个数据表而无需发出多条查询,MERGE数据表还提供了如下一些便利。

 

 

MERGE数据表能够用来建立一个尺寸超过各个MyISAM数据表所容许的最大长度逻辑单元

你看一把通过压缩的数据表包括到MERGE数据表里。好比说,在某一年结束以后,你应该不会再往相应的日志文件里添加记录,因此你能够用myisampack工具压缩它以节省空间,而MERGE数据表仍能够像往常那样工做

 

MERGE数据表也支持DELETE 和UPDATE操做。INSERT操做比较麻烦,由于MySQL须要知道应该把新数据行插入到哪个成员表里去。在MERGE数据表的定义里能够包括一个INSERT_METHOD选项,这个选项的可取值是NO、FIRST、LAST,他们的含义依次是INSERT操做是被禁止的、新数据行将被插入到如今UNION选项里列出的第一个数据表或最后一个数据表。好比说,如下定义将对log_merge数据表的INSERT操做被看成对log_2007数据表----它是UNION选项所列出的最后一个数据表:

 

CREATE TABLE log_merge  

(  

    dt DATETIME NOT NULL,  

    info VARCHAR(100) NOT NULL,  

  INDEX(dt)  

) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007)  

INSERT_METHOD = LAST;  


建立一个新的成员数据表log_2009并让他有一样的表结构,而后修改log_merge数据表把log_2009包括进来:

 

 

log_2009:  

CREATE TABLE log_2009 LIKE log_2008;  

ALTER TABLE log_merge  

UNION = (log_2004, log_2005, log_2006, log_2007,log_2008,log_2009);  

 

MySQL中merge表存储引擎用法

在Mysql数据库中,Merge表有点相似于视图。mysql的merge引擎类型容许你把许多结构相同的表合并为一个表。以后,你能够执行查询,从多个表返回的结果就像从一个表返回的结果同样。每个合并的表必须有彻底相同表的定义和结构。

 

Mysql Merge表的优势:

A. 分离静态的和动态的数据

B. 利用结构接近的的数据来优化查询

C. 查询时能够访问更少的数据

D. 更容易维护大数据集

E. 能够经过修改.mrg文件来修改Merge表,固然也能够用alter进行修改,修改后要经过FLUSH TABLES刷新表缓存,此法能够动态增长减小子表

若是须要把日志记录不停的录入MySQL数据库,而且天天、每周或者每月都建立一个 单一的表,并且要制做来自多个表的合计查询,MERGE表这时会很是有效。然而,这项功能有局限性。你只能合并MyISAM表并且必须严格遵照相同的表定 义的限制。虽然这看起来好像是一个大问题,可是,若是你使用另一种表类型(例如InnoDB),这种合并可能就不须要.
下面定义以下几个表:

基本表:

CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)TYPE=MyISAM;

CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID))TYPE=MyISAM;

CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST AUTO_INCREMENT=1 UNION=(TEST_MERGE_1,TEST_MERGE_2);

说明:
1. 此表结构必须与基本表彻底一致,包括列名、顺序。UNION表必须同属一个DATABASE。
2. 此表相似于SQL中的union机制。
3. 基本表类型必须是MyISAM的。
4. 能够经过修改.mrg文件来修改MERGE表,每一个基本表的名字占一行。注意:修改后要经过FLUSH TABLES刷新表缓存。
5. 对基本表的更改能够直接反映在此表上。
6. INSERT_METHOD的取值能够是: 0 不容许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0以后可用)
7. 定义在它上面的约束没有任何做用,约束是由基本表控制的,例如两个基本表中存在着一样的一个Key值,那么在MERGE表中会有两个同样的Key值。

注意:
1.若是是经过修改.mrg文件的方式来修改MERGE表,那么必定要修改后要经过FLUSH TABLES刷新表缓存,不然修改不会生效。最近犯过一次这样的错误。
2.在数据量、查询量较大的状况下,不要试图使用Merge表来达到相似于Oracle的表分区的功能,会很影响性能。个人感受是和union几乎等价。
3.查询结果及顺序与建立Merge表时联合表的顺序有关。
假设有这样两条个语句:
INSERT INTO TEST_MERGE_1(ID,VALUE) VALUES(1,'ciray');
INSERT INTO TEST_MERGE_2(ID,VALUE) VALUES(1,'blog.csdn.net/ciray');
而后,这个查询:
SELECT * FROM TEST_MERGE WHERE ID=1;
将 只会获得一条记录(1,'ciray'),并非两条记录,也不会是(1,'blog.csdn.net/ciray')。这是由于ID是 PRIMARY KEY,若是在第一个表中查询到记录,则不在后面的表中记录查。若是ID并无定义惟一性约束,则这个查询会获得两条记录。

相关文章
相关标签/搜索