欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql Merge引擎 博客分类: mysql mysql引擎merge

程序员文章站 2024-03-16 21:47:04
...
若可以使用表分区,应首选表分区而不是使用merge来分表。
1.也叫MRG_MyISAM,merge引擎使用示例:
mysql Merge引擎
            
    
    博客分类: mysql mysql引擎merge
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表中会被索引但不是主键索引(唯一索引同理)
mysql Merge引擎
            
    
    博客分类: mysql mysql引擎merge
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表才能删除
 
  • mysql Merge引擎
            
    
    博客分类: mysql mysql引擎merge
  • 大小: 83.8 KB
  • mysql Merge引擎
            
    
    博客分类: mysql mysql引擎merge
  • 大小: 24.8 KB