当前位置: 首页 > news >正文

【Mysql 学习】 MERGE表方面的问题(二)

shell> cd /mysql-data-directory/current-database
shell> ls -1 t1 t2 > total.MRG
shell> mysqladmin flush-tables
要重映射一个MERGE表到一个不同的MyISAM表集,你可以执行下列之一:
·DROP MERGE表并且重建它。
·使用ALTER TABLE tbl_name UNION=(...)来改变底层表的列表。
·改变.MRG文件,并对MERGE表或者所有底层表发出一个FLUSH TABLE语句来强制存储引擎去读新的定义文件。
MERGE表可以帮你解决以下问题:
·容易地管理一套日志表。比如,你可以把不同月的数据放进分离的表中,用myisampack压缩其中的一些,并随后创建一个MERGE表来把它们当作一个来使用。
·获得更快的速度。你可以以一些标准来分割大的只读表,然后放进不同磁盘上的单个表中。基于此的一个MERGE表可比使用大表要快得多。
·执行更有效的搜索。如果你确切知道要搜索什么,对一些查询你可以只在被分割的表的其中之一来搜索,并且对其它使用MERGE。你甚至有许多不同的MERGE表,它们使用有重叠的表套。
·执行更有效的修补。修补被映射到一个MERGE表中的单个表比修补单个大型表要更轻松。
·即刻映射许多表成一个。MERGE表不需要维护它自己的索引,因为它使用大哥表的所用。因此,MERGE表集合是非常块地创建或重映射。(注意,当你创建一个MERGE表之时,即使没有索引被创建,你必须仍然指定索引定义)。
·如果根据需要或按照批次,你有一组要合起来作为一个大表的表,你应该根据需要对它们创建一个MERGE表来替代大表。这样要快得多而且节约大量的磁盘空间。
·超过操作系统的文件尺寸限制。每个MyISAM表都受制于这个限制,但是一个MyISAM表的集合则不然。
·你可以通过定义一个映射到单个表的MERGE表来为一个MyISAM表创建一个别名或“同物异名”。这样做应该没有真实的可察觉的性能影响 (对每个读只有一些间接调用和memcpy()调用)。
MERGE表的缺点:
·只能对MERGE表使用仅相同的MyISAM表。
·不能在MERGE表中使用很多MyISAM功能。比如,不能在MERGE表上创建FULLTEXT索引。(可以在底层MERGE 表上创建FULLTEXT索引,但不能用全文搜索来搜索MERGE表)。
·如果MERGE表是非临时的,所有底层MyISAM表也必须是永久的。如果MERGE表是临时的,MyISAM表可以是任何临时&非临时的混合。
·MERGE表使用更多的文件描述符。如果是个客户端正使用一个映射到10个表的MERGE表,服务器使用(10*10)+10个文件描述符。(10个数据文件描述符给10个客户端每人一个,并且在客户端之间共享10个索引文件描述符)。
· 键读会更慢。当你读一个键的时候,MERGE存储引擎需要在所有 底层表上发出一个读以检查哪一个接近匹配给定的键。如果你随后做了一个read-next,MERGE存储引擎需要搜索读缓冲来找出下一个键。只有当一个键缓冲被耗尽,存储引擎才需要读下一个键块。这使得MERGE键在eq_ref搜索中非常慢,但在ref搜索中不是太慢。

下列是已知关于MERGE表的问题:
·如果你使用ALTER TABLE 来把MERGE表变为其它表类型,到底层表的映射就被丢失了。取而代之的,来自底层MyISAM表的行被复制到已更换的表中,该表随后被指定新类型。
·REPLACE不起作用。
·没有WHERE子句,或者在任何被映射到一个打开的MERGE表上的任何一个表上的REPAIR TABLE,TRUNCATE TABLE, OPTIMIZE TABLE或ANALYZE TABLE,你不能使用DROP TABLE, ALTER TABLE, DELETE FROM。如果你这么做了,MERGE表将仍旧指向原始表,这样产生意外结果。解决这个不足最简单的办法是在执行任何一个这些操作之前发出一个FLUSH TABLES语句来确保没有MERGE表仍旧保持打开。
·一个MERGE表不能在整个表上维持UNIQUE约束。当你执行一个INSERT, 数据进入第一个或者最后一个MyISAM表(取决于INSERT_METHOD选项的值)。MySQL确保唯一键值在那个MyISAM表里保持唯一,但不是跨集合里所有的表。
·当你创建一个MERGE表之时,没有检查去确保底层表的存在以及有相同的机构。当MERGE表被使用之时,MySQL检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的MyISAM表创建一个MERGE表,你非常有可能撞见奇怪的问题。
·在MERGE表中的索引的顺序和它的底层表中的索引应该一样。如果你使用ALTER TABLE给一个被用在MERGE表中的表添加一个UNIQUE索引,然后使用ALTER TABLE在MERGE表上添加一个非唯一索引,如果在底层表上已经有一个非唯一索引,对表的索引排序是不同的。(这是因为ALTER TABLE把UNIQUE索引放在非唯一索引之前以利于重复键的快速检测 )。因此对使用这样索引的表的查询可能返回不期望的结果。
·在Windows中,在一个被MERGE表使用的表上DROP TABLE不起作用,因为MERGE引擎的表映射对MySQL的更上层隐藏。因为Windows不允许已打开文件的删除,你首先必须刷新所有MERGE表(使用FLUSH TABLES)或在移除该表之前移除MERGE表。 

相关文章:

  • win8 开发之旅(7) --五子棋游戏开发
  • java中的String类型(不知道理解的好不,请教大神)
  • leetcode 237 Delete Node in a Linked List python
  • 【转】Java 项目UML反向工程转化工具
  • 新一代编程:scala泛函编程技术-唠叨
  • 音乐还在陪伴我
  • RTB业务知识之2-Impression概念和关键属性
  • 触摸事件之响应者链验证
  • imx6 PCIE使能加载ath9k无线网卡
  • 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转载)
  • 聚焦“裂变”,又拍云推出直播云等多场景解决方案
  • Nginx负载平衡 + Tomcat + 会话存储Redis配置要点
  • 基于矩阵分解的推荐算法
  • 虚拟机安装OSX10.11.4+编译libVLC和VLC源码
  • 容器类组件介绍
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • k个最大的数及变种小结
  • Laravel 中的一个后期静态绑定
  • Odoo domain写法及运用
  • overflow: hidden IE7无效
  • Python学习之路13-记分
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 编写符合Python风格的对象
  • 从输入URL到页面加载发生了什么
  • 浮现式设计
  • 后端_MYSQL
  • 机器学习 vs. 深度学习
  • 一个完整Java Web项目背后的密码
  • 再谈express与koa的对比
  • 在Unity中实现一个简单的消息管理器
  • 7行Python代码的人脸识别
  • ​​​​​​​​​​​​​​Γ函数
  • (07)Hive——窗口函数详解
  • (39)STM32——FLASH闪存
  • (C语言)球球大作战
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)原始图像数据和PDF中的图像数据
  • (转载)深入super,看Python如何解决钻石继承难题
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ..回顾17,展望18
  • .form文件_一篇文章学会文件上传
  • .Net FrameWork总结
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 服务 ServiceController
  • .NET企业级应用架构设计系列之技术选型
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @Autowired多个相同类型bean装配问题
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [AX]AX2012 R2 出差申请和支出报告
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C# 网络编程系列]专题六:UDP编程
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件