若可以使用表分区,应首选表分区而不是使用merge来分表。
1.也叫
MRG_MyISAM,
merge引擎使用示例:
![](https://i-blog.csdnimg.cn/blog_migrate/251374c90560c122a8d09f4853d49c82.png)
2.目前(2015-11-05)merge引擎所关联的表只能是MyISAM引擎,不能是Innodb引擎
3.在merge table上是用drop table时只是影响的merge table并不影响被关联表如(t1,t2)
4.创建merge表必须要有
UNION=(list-of-tables
)语句
insert_method为可选参数,取值为last,first,no 其中last为插入到union中的最后一张表,first为插入到第一张表,no表示merge表不可插入若强行执行插入会报错
5.merge表所依赖的各个表的主键在merge表中会被索引但不是主键索引(唯一索引同理)
![](https://i-blog.csdnimg.cn/blog_migrate/6aabd1ad966816985ec6b03e06ae910d.png)
6.修改merge表所依赖的表有两种方式:
a.删除merge表并重新创建
b.alter table merge_table union=(t1,t2,...);
7.union中所有表的结构和索引必须严格一致,但这个一致性检查是在打开merge表的时候进行检查,而不是在创建的时候检查;
其中列的一致性要求如下:
a.union中的表和merge表必须column名称、个数一致
b.对应列类型必须完全相同
c.对应列长度定义必须完全相同
d.union中表的列可以为null
索引一致性要求如下:
a.union中表的索引可以大于等于merge表的索引,但不能少于merge表的索引
b.union中表的索引类型必须和merge表中的索引类型一致
c.对于复合索引,union中各个表索引中的列必须和merge表中索引列完全相同
d.各个部分索引中的索引长度、语言必须完全一致;是否为空也必须一致
8.merge表使用有问题,使用 check table语句可以找到问题。
使用场景及优缺点
优点:
1.可以很容易管理一组日志表。
比如可以将日志表按不同月份放到不同的表中,再用myisampack压缩,然后再用merge来接起来做一个表使用。
2.速度更快。
对于只读大表来说可以将其拆分为多个子表并存放在不同的硬盘上,再通过merge表将其合为一个逻辑表。
3.查询性能高。
对于已经明确查询的数据可以从merge所依赖的单个表查询,对于其他的查询则可以使用merge来进行(即既可以从子表单独查询又可以从merge表查询)。
可以创建多个merge表并且多个merge表可以依赖同一张表。
4.更容易维护、修复。
如果一个大表不拆分,则修复起来非常困难;若将大表拆分为多个小的子表,则这些子表因为比较小所以修复起来也容易。
5.快速整合多个表。
由于merge表使用的是各个子表的索引,所以它不需要维护索引,这样创建merge表就非常快。(但是在创建表的时候仍需指定索引,但是该索引并不会被创建)
6.如果将多个子表合并为一个大表,则使用merge会节省一大部分磁盘空间。
7.文件大小限制
单张MyISAM表大小受限于操作系统单个文件大小,但是使用merge可以使用多个MyISAM表
8.为表创建别名
也可以在merge表中union语句中只指定一张表来为Myisam表创建别名,并且对性能影响非常小(只是在读的时候会多一些间接调用和
memcpy()调用
)
缺点:
1.merge表中只能是myisam表
2.并不是所有的myisam表特性都能在merge表中使用。
如:merge表不支持full-text全文索引
3.如果merge表是非临时表(临时表:create temporary table ...),则所依赖表都不能是临时表;如果merge表是临时表,则依赖表既可以是临时表也可以是非临时表。
4.使用的文件描述符比myiasm多
例如,10个客户端来使用一个有10个依赖子表的merge表时,则服务器会使用(10 x 10) + 10个文件描述符;其中每个客户端会开启10个文件描述符(因为有10个子表),并且会开启10个索引文件描述符来在多个客户端中共享使用。
5.索引查询更慢。
索引查询时,merge存储引擎会向所有子表发送一个查操作,并将最匹配索引种的值返回;当读下一个值时,merge表会从读缓存种读取下一个值,如果读缓存被用完,则读取下一个索引块。这使得merge表在进行eq_ref查询时比较慢,但是在ref查询时则不是很慢。
6.alter修改merge表引擎时,union种的表会丢失
7.merge表自己不维护唯一索引,只是在插入到对应表中时由对应表来确认单张表中是否唯一,而不能保证在所有子表中唯一
8.merge表以及所依赖的子表都不支持分区
9.drop子表中任何一个子表时,windows下必须flush_table merge表或者删除merge表才能删除