Mysql合并表原理

1.概述:

合并表是一种早期的、简单的分区实现,和分区表相比有一些不同的限制,并且缺乏优化。分区表严格来说是一个逻辑上的概念,用户无法访问底层的各个分区,对用户来说分区是透明的。但是合并表允许用户单独访问各个子表。分区表和优化器的结合更紧密,这也是未来发展的趋势,而合并表则是一种将要被淘汰的技术,在未来的版本中可能被删除。

2.原理:

合并表相当于一个容器,里面包含了多个真实表,可以在CREATE TABLE中使用一种特别的UNION语法来制定包含哪些真实表。下面是一个创建合并表的例子:

1create table t1(a int not null primary key)engine=MyIsam; 2create table t2(a int not null primary key)engine=MyIsam; 3insert into t1(a) values(1),(2); 4insert into t2(a) values(1),(2); 5create table mrg(a int not null primary key) 6engine=merge union=(t1,t2) insert_method=last; 7select a from mrg;  

注意到,这里最后建立的合并表和前面的各个真实表字段完全相同,在合并表中有索引各个真实子表也有,这是创建合并表的前提条件,另外需要注意到,各个子表在对应列上都有主键限制,但是最终的合并表中仍然出现了重复值,这是合并表的另一个不足,合并表中的每一个子表行为和表定义都是相同,但是合并表在全局上并不受这些条件限制。

合并表的局限:

1)在使用create语句创建一个合并表的时候,并不会检查各个子表的兼容性。如果子表的定义稍有不同,那么mysql就可能创建出一个后面无法使用的合并表。

另外,如果在成功创建了合并表后再修改某个字段的定义,那么之后再使用合并表可能会报错;

2)根据合并表的特性,不难发现,在合并表上无法使用replace语法,无法使用自增字段

3)执行范围查询时,需要在每一个子表上各执行一次,这比直接访问单个表的性能要差很多,而且子表越多,性能越糟糕

4)全表扫描和普通表的全表扫描速度相同

5)在合并表上做唯一键和主键查询时,一旦找到一行数据就会停止,所以一旦查询在合并表的某一个子表中找到一行数据,就会立即返回,不会再访问任何其他的表

6)子表的读取顺序和create table语句中的顺序相同,如果需要频繁地按照某个特定顺序访问表,那么可以通过这个特性来让合并排序操作更高效

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

MySQL分区表的管理~1

一、如何管理RANGE和LIST分区以该分区表为例!复制代码(https://oscimg.oschina.net/oscnet/33f58549bdff038e3944801cff215e9419a.gif)CREATETABLEmembers(idINT,fnameVARCHA

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0