1.概述:
合并表是一种早期的、简单的分区实现,和分区表相比有一些不同的限制,并且缺乏优化。分区表严格来说是一个逻辑上的概念,用户无法访问底层的各个分区,对用户来说分区是透明的。但是合并表允许用户单独访问各个子表。分区表和优化器的结合更紧密,这也是未来发展的趋势,而合并表则是一种将要被淘汰的技术,在未来的版本中可能被删除。
2.原理:
合并表相当于一个容器,里面包含了多个真实表,可以在CREATE TABLE中使用一种特别的UNION语法来制定包含哪些真实表。下面是一个创建合并表的例子:
create table t1(a int not null primary key)engine=MyIsam;
create table t2(a int not null primary key)engine=MyIsam;
insert into t1(a) values(1),(2);
insert into t2(a) values(1),(2);
create table mrg(a int not null primary key)
engine=merge union=(t1,t2) insert_method=last;
select a from mrg;
注意到,这里最后建立的合并表和前面的各个真实表字段完全相同,在合并表中有索引各个真实子表也有,这是创建合并表的前提条件,另外需要注意到,各个子表在对应列上都有主键限制,但是最终的合并表中仍然出现了重复值,这是合并表的另一个不足,合并表中的每一个子表行为和表定义都是相同,但是合并表在全局上并不受这些条件限制。
合并表的局限:
1)在使用create语句创建一个合并表的时候,并不会检查各个子表的兼容性。如果子表的定义稍有不同,那么mysql就可能创建出一个后面无法使用的合并表。
另外,如果在成功创建了合并表后再修改某个字段的定义,那么之后再使用合并表可能会报错;
2)根据合并表的特性,不难发现,在合并表上无法使用replace语法,无法使用自增字段
3)执行范围查询时,需要在每一个子表上各执行一次,这比直接访问单个表的性能要差很多,而且子表越多,性能越糟糕
4)全表扫描和普通表的全表扫描速度相同
5)在合并表上做唯一键和主键查询时,一旦找到一行数据就会停止,所以一旦查询在合并表的某一个子表中找到一行数据,就会立即返回,不会再访问任何其他的表
6)子表的读取顺序和create table语句中的顺序相同,如果需要频繁地按照某个特定顺序访问表,那么可以通过这个特性来让合并排序操作更高效