MySQL高级特性-合并表

1. Merge Tables

        如果愿意的话,可以把合并表看成一种较老的、有更多限制的分区表,但是它们也有自己的用处,并且能提供一些分区表不能提供的功能。

合并表实际是容纳真正的表的容器。可以使用特殊的UNION语法来CREATE TABLE。下面是一个合并表的例子:

mysql>   
CREATE TABLE t1(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;    
mysql>   
CREATE TABLE t2(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;    
mysql>   
INSERT INTO t1(a) VALUES(1),(2);   
mysql>   
INSERT INTO t2(a) VALUES(1),(2);    
mysql>   
CREATE TABLE mrg(a INT NOT NULL PRIMARY KEY)    ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;    
mysql> SELECT a FROM mrg;

+——+  
  |  a    |  

+——+  
  |   1  | 
  |   1  | 
  |   2  |  
  |   2  | 
 +——+ 

       注意到合并表包含的表列的数量和类型都是一样的,并且合并表上的索引也会在下属表上存在。这是创建合并表的要求。也要注意到在每个表的独有列上有主键,这会导致合并表有重复的行。这是合并表的一个局限:合并表内的每个表行为都很正常,但是它不会对下面的所有表进行强制约束。

  1. INSERT_METHOD=LAST

 指令告诉MySQL把所有的INSERT语句都发送到合并表的最后一个表上。定义FIRST或LAST是控制插入数据位置的唯一方式(但是也可以直接插入到下属表中)。

分区表可以更多地控制数据存放的位置。

下面的INSERT语句对合并表和下属表都可见:

mysql> INSERT INTO mrg(a) VALUES(3);    
mysql> SELECT a FROM t2;

 +—+  

  | a | 

 +—+ 

  | 1 | 

  | 2 |

  | 3 | 

 +—+ 

合并表还有其他有趣的特性和限制,比如删除合并表或它的某个下属表。删除合并表让所有的"子表"都变得不可访问,但是删除其中的某个子表有不同的影响,它的行为和操作系统有关。例如,在GNU/Linux上,子表的文件描述符还保持开启的状态,并且表还继续存在,但是只能从合并表中访问。

  1. mysql> DROP TABLE t1, t2;  mysql> SELECT a FROM mrg

 +——+ 

  | a     | 

 +——+ 

  |     1 | 

  |     1 |  

  |     2 |

  |     2 |

  |     3 | 

 +——+ 

还有一些另外的局限性和特殊行为。最好的办法是阅读手册,但是在这儿要说的是REPLACE并不能在所有的合并表上工作,并且AUTO_INCREMENT不会像你期望的那样工作。

2. 合并表对性能的影响

        MySQL对合并表的实现对性能有一些重要的影响。和其他MySQL特性一样,它在某些条件下性能会更好。下面是关于它的一些注意事项:

       1) 合并表比含有同样数据的非合并表需要更多的文件描述符。尽管合并表看上去是一个表,它实际是逐个打开了下属表。这样的结果就是单个表的缓存可以创建许多文件描述符。因此,即使已经配置了表的缓存,让服务器线程的文件描述符数量不要超过操作系统的限制,合并表仍然有可能导致超过这一限制。

        2) 创建合并表的CREATE语句不会检查下属表是否是兼容的。如果下属表的定义有轻微的不一样,MySQL会创建合并表,但是却无法使用。同样,如果在创建了一个有效的合并表之后对某个下属表进行了改变,它也会无法工作,并且会显示下面的错误信息:"ERROR 1168(HY000):无法打开定义不同的下属表,或者非MyISAM表,或者不存在的表"。

       3)访问合并表的查询访问了每一个下属表。这也许会使单行键查找比单个表慢。在合并表中限制下属表是一个好主意,尤其是它是联接中的第二个或以后的表。每次操作访问的数据越少,那么访问每个表的开销相对于整个操作而言就越重要。下面是一些如何使用合并表的注意事项:

       4)范围查找受访问所有下属表的开销的影响小于单个查找。

      对索引表的表扫描和对单个表一样快。

       一旦唯一键和主键查询成功,它们就立即停止。在这种情况下,服务器会挨个访问下属表,一旦查找到了值,就不会再查找更多的表。

下属表读取的顺序和CREAT TABLE语句中定义的一致。如果经常需要按照特定的顺序取得数据,可以利用这种特性使合并排序操作更快。

3. 合并表的长处

     合并表在处理数据方面既有积极的一面,也有消极的一面。

      1) 经典的例子就是日志记录。日志是只追加的,所以可以每天用一个表。每天创建新的表并把它加入到合并表中。也可以把以前的表从合并表中移除掉,把它转化为压缩的MyISAM表,再把它们加回到合并表中。

      2) 日志追加这并不是合并表的唯一用途。它们通常都被用于数据仓库程序,因为它的另一个长处就是管理大量的数据。在实际中不太可能管理一个TB级别的表,但是如果是由单个50GB的表组成的合并表,任务就会简单很多。

       当管理极其巨大的数据库时,考虑的绝不仅仅是常规操作。还要考虑崩溃与恢复。使用小表是很好的主意。检查和修复一系列的小表比起一个大表要快得多,尤其是大表和内存不匹配的时候。还可以并行地检查和修复多个小表。

       数据仓库中另外一个顾虑就是如何清理掉老的数据。对巨型表使用DELETE语句最佳状况下效率不高,而在最坏情况下则是一场灾难。但是更改合并表的定义是很简单的,可以使用DROP TABLE命令删除老的数据。这可以轻易地实现自动化。

     3) 合并表并非只对日志和大量数据有效。它可以方便地按需创建繁忙的表。创建和删除合并表的代价是很低的。索引可以像对视图使用UNION ALL命令那样使用合并表。但它的开销更低,因为服务器不会把结果放到临时表中然后再传递给客户端。这使得它对于报告和仓库化数据非常有用。例如,要创建一个每晚都会运行的任务,它会把昨天的数据和8天前、15天前、以及之前的每一周的数据进行合并。使用合并表就可以创建无须修改的查询,并且自动地访问合适的数据。甚至还可以创建临时合并表,这是视图无法做到的。

因为合并表没有隐藏下属的MyISAM表,所以它提供了一些分区表无法提供的特性:

一个MyISAM表可以包含很多合并表。

可以通过拷贝.frm、.MYI、.MYD文件在服务器之间拷贝下属表。

可以轻易地把更多的表添加到合并表中。这只需要创建一个新表并且更改合并定义即可。

可以创建只包含想要的数据的临时合并表,例如某个特定时间段的数据。这是分区表无法做到的。

如果想对某个表进行备份、恢复、更改、修复,或者其他的操作,可以把它从合并表中移除,完成所有的工作之后再把它加回来。

可以使用myisampack压缩某些或所有的下属表。

分区表正好相反,MySQL隐藏了分区表的分区,并只能通过分区表访问所有的分区

转自:http://blog.csdn.net/hguisu/article/details/7164356

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/3112

(0)
s19930811s19930811
上一篇 2015-04-13
下一篇 2015-04-13

相关推荐

  • N-22-南京-修 第三周博客作业

    #1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [xujie@localhost ~]$ who | cut -d " " -f1 | sort -u #2、取出最后登录到当前系统的用户的相关信息。 [root@localhost xujie]# last -x | head -1 #3、取出…

    Linux干货 2016-09-15
  • shell脚本进阶

    一、流程控制 过程式编程语言:顺序执行、选择执行、循环执行 1.1 条件语句 1.1.1 if条件选择语句  选择执行: (注意: if 语句可嵌套) v  单分支:if  判断条件;then           条件为真的分支代…

    Linux干货 2016-11-27
  • 0809linux基础小记(sed和vim用法)

    sed  [options] ‘scripts’ inputfile -n: 不输出模式空间内容的自动打印 -e: 多点编辑 -f:从指定文件中读取编辑脚本 -i:原处编辑 scripts: ’地址命令’ 地址定界: (1)  不给地址:对全文进行处理 (2)  单地址: #:  指定的行 例: sed '2…

    Linux干货 2016-08-11
  • Docker 简介

    Docker在现有云计算虚拟化中是非常火的一个项目,那么他和虚拟化有什么不同呢 从上图来看,好像和我们之前说到的虚拟化并没有什么不同,但这里需要说明的是在各guest主机上,是没有操作系统的,他们共用Host主机上的内核空间,只对用户空间进行了隔离。 因此在这种环境下我们不把他称为虚拟化而称作容器。 此种方式的实现主要基于了linux内核自带的两项技术,分别…

    2017-03-19
  • Linux软件包管理(YUM)及编译安装

    YUM 一、yum安装使用: 1、Yum:rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具 2、yum repository:yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下) 3、yum客户端配置文件: /etc/yum.conf:为所有仓库提供公共配置 /et…

    Linux干货 2016-08-26
  • linux学习笔记: shell脚本编程相关(上)

    前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的。 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例。 shell脚本的格式  首行shebang机制:  bash脚本,首行添加#!/bin/bash&nbsp…

    Linux干货 2017-04-18