Mysql合并表原理

Wesley13
• 阅读 324

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语句中的顺序相同,如果需要频繁地按照某个特定顺序访问表,那么可以通过这个特性来让合并排序操作更高效

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
MySQL分区表的管理~1
一、如何管理RANGE和LIST分区以该分区表为例!复制代码(https://oscimg.oschina.net/oscnet/33f58549bdff038e3944801cff215e9419a.gif)CREATETABLEmembers(idINT,fnameVARCHA
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
2年前
PostgreSQL从继承到分区(二)
二、Partitioning\_table2.1关于分区表借助表的继承特性PostgreSQL实现了分区表功能,虽然相比Oracle、MySQL的分区表来说其实现过程比较麻烦,但是这种方式同样能达到分区的效果,而且对大表的查询优化效果很明显。PostgreSQL的分区表概念与其它数
Wesley13 Wesley13
2年前
HGDB分区表的使用与管理
目录文档用途详细信息文档用途了解HGDB分区表的简单使用详细信息1.简介数据库表分区把一个大的物理表分成若干个小的物理表,并使得这些小物理表在逻辑上可以被当成一张表来使用。一般来讲我们把上述说明中的大的物理表称为父表/主表,小的物理表称为子表/分区表。主表/父表/MasterTable 该表是创建子表的模板。它是
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这