设为首页 收藏本站
查看: 670|回复: 0

[经验分享] MySQL MERGE存储引擎 简介及用法

[复制链接]

尚未签到

发表于 2017-12-12 17:04:05 | 显示全部楼层 |阅读模式
  MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。
  假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份:
  CREATE TABLE log_YY  
  (  
  dt  DATETIME NOT NULL,  
  info VARCHAR(100) NOT NULL,  
  INDEX (dt)  
  ) ENGINE = MyISAM;  
  假设日志数据表的当前集合包括 log_2004、log_2005、log_2006、log_2007 ,而你可以创建一个如下所示的MERGE数据表把他们归拢为一个逻辑单元:
  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);  
  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>  将 只会得到一条记录(1,'ciray'),并不是两条记录,也不会是(1,'blog.csdn.net/ciray')。这是因为ID是 PRIMARY KEY,如果在第一个表中查询到记录,则不在后面的表中记录查。如果ID并没有定义唯一性约束,则这个查询会得到两条记录。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423403-1-1.html 上篇帖子: mysql 查看表定义 下篇帖子: mysql-5.7.17-winx64免安装版,win10环境下安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表