存储引擎是MySQL组件处理SQL操作不同的表类型。InnoDB是默认和最通用的存储引擎,Oracle建议使用它的表,除了专业的使用案例。(TheCREATE TABLE在MySQL 5.0语句创建InnoDB表的默认。)
MySQL服务器使用一个可插拔的存储引擎的架构,使存储引擎被装入和卸载从运行MySQL服务器。
确定你的服务器支持的存储引擎,用SHOW ENGINES声明。the value in the支持列指示发动机是否可以使用。一个值YES,不,或DEFAULT表明发动机可用,不可用,或可与当前设置为默认存储引擎。
MySQL的>SHOW ENGINES\G*************************** 1。行***************************引擎:performance_schema支持:是的评论:性能schematransactions:没有阿隆索:没有保存点:没有*************************** 2。行***************************引擎:InnoDB支持:默认评论:支持事务,行级锁,外keystransactions:是阿隆索:是保存点:是的*************************** 3。行***************************引擎:mrg_myisam支持:是的评论:相同的MyISAM tablestransactions收集:没有阿隆索:没有保存点:没有*************************** 4。行***************************引擎:黑洞的支持:是的评论:/dev/null存储引擎(任何你写它消失)交易:没有阿隆索:没有保存点:没有*************************** 5。行***************************引擎:MyISAM支持:是的评论:MyISAM存储enginetransactions:没有阿隆索:没有保存点:NO.。
本章涵盖了专用的MySQL存储引擎的使用案例。它不包括默认InnoDB存储引擎或NDB存储引擎,覆盖15章,InnoDB存储引擎和MySQL NDB集群7.5%和NDB集群7.6。对于高级用户,它还包含一个描述的可插拔的存储引擎体系结构(见16.11部分,概述MySQL存储引擎体系结构”)
关于商业的MySQL服务器的二进制文件提供的功能的信息,参见MySQL版本,对MySQL的网站。可用的存储引擎可能取决于您所使用的版本的MySQL。
在对常见问题的解答关于MySQL存储引擎,看第二中,“MySQL 8常见问题:存储引擎”
MySQL 8支持的存储引擎
- InnoDB:在MySQL 8的默认存储引擎。- InnoDB是一个交易的安全(酸标准)的MySQL已经提交,存储引擎回滚和崩溃恢复功能,保护用户数据。- InnoDB行级锁(没有升级到粗粒度的锁)和甲骨文风格一致的非锁定读增加多用户并发性和性能。- InnoDB存储用户数据的聚集索引来减少I/O的查询基于主键的常见。为了维护数据的完整性,- InnoDB还支持- 外键引用完整性约束。为更多的信息关于- InnoDB,看到15章,InnoDB存储引擎
 
- MyISAM:这些表有一个小的足迹。表级锁限制在读写性能的工作负载,故常用于只读或读大多工作在Web和数据仓库的配置。
 
- Memory:存储在RAM中的所有数据,对环境要求非关键数据的快速查找,快速访问。这台发动机的前身为- 堆引擎其使用的情况下会减少;- InnoDB其缓冲池的内存区域,提供了一个通用的持久的方式让大多数或所有内存中的数据,并- ndbcluster提供了巨大的分布式数据集的快速查找的关键值。
 
- CSV:表真的用逗号分隔的值的文本文件。CSV表格让你进出场数据的CSV格式,用脚本和应用程序读写同一格式的数据交换。因为CSV表没有索引,你通常保持数据- InnoDB在正常操作期间的表,只有使用CSV表进出口阶段。
 
- Archive:这些紧凑的索引表用于存储和检索大量很少引用历史,存档,或安全审计信息。
 
- Blackhole:黑洞存储引擎接受但不存储数据,类似于UNIX- /dev/null设备查询总是返回一个空集。这些表可以用于复制配置在DML语句发送到从服务器的主服务器,但不保持自己的数据副本。
 
- Merge使一个MySQL DBA或开发人员:逻辑组一系列相同- MyISAM表和参考他们作为一个对象。对于大型数据库等数据仓库环境好。
 
- Federated:提供单独的MySQL服务器链接创建从多个物理服务器一个逻辑数据库的能力。很好的分布式环境或数据集市。
 
- Example:本机为例,在MySQL源代码说明了如何开始编写新存储引擎。它主要是开发人员的兴趣。存储引擎是一个“树桩“什么也不做。你可以创建此引擎的表,但没有数据可以存储在他们或从他们。
 
不限制您使用相同的存储引擎为整个服务器或模式。您可以指定任何表的存储引擎。例如,一个应用程序可能使用最多InnoDB表一CSV导出数据到电子表格和一些表MEMORY临时工作表
选择一个存储引擎
不同的存储引擎提供MySQL设计不同的用例在心。下表提供了一些存储引擎提供MySQL的概述,明确指出如下表。
表16.1存储引擎的特点总结
| 功能特色 | MyISAM | 内存 | InnoDB | 资料库 | NDB | 
|---|
| 树索引 | 是 | 是 | 是 | 否 | 否 | 
| 在时间点的备份/恢复(注一) | 是 | 是 | 是 | 是 | 是 | 
| 群集数据库支持 | 否 | 否 | 否 | 否 | 是 | 
| 聚簇索引 | 否 | 否 | 是 | 否 | 否 | 
| 压缩数据 | 是的(注2) | 否 | 是 | 是 | 否 | 
| 数据高速缓存 | 否 | N / A | 是 | 否 | 是 | 
| 数据加密传输(注3) | 是 | 是 | 是 | 是 | 是 | 
| 外键的支持 | 否 | 否 | 是 | 否 | 是的(注4) | 
| 全文搜索索引 | 是 | 否 | 是的(注5) | 否 | 否 | 
| 地理空间数据类型的支持 | 是 | 否 | 是 | 是 | 是 | 
| 地理空间索引支持 | 是 | 否 | 是的(注6) | 否 | 否 | 
| 哈希索引 | 否 | 是 | 没有(注7) | 否 | 是 | 
| 索引缓存 | 是 | N / A | 是 | 否 | 是 | 
| 锁粒度 | 表 | 表 | 排 | 排 | 排 | 
| MVCC | 否 | 否 | 是 | 否 | 否 | 
| 复制支持(注一) | 是 | Limited(注8) | 是 | 是 | 是 | 
| 存储限制 | 256tb | RAM | 64tb | 无 | 384eb | 
| T树索引 | 否 | 否 | 否 | 否 | 是 | 
| 交易 | 否 | 否 | 是 | 否 | 是 | 
| 更新数据字典数据 | 是 | 是 | 是 | 是 | 是 | 
笔记
1.。在服务器上执行,而不是在存储引擎。
2。压缩MyISAM表是仅当使用行压缩格式支持。使用行压缩格式的MyISAM表是只读的。
三.实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。
4。对于外键的支持在MySQLCluster NDB 7.3和以后的可。
5。全文索引在MySQL InnoDB支持5.6及以后版本可用。
6.。地理空间索引支持MySQL InnoDB 5.7后来是可用的。
7。InnoDB使用哈希索引内部的自适应哈希索引的特征。
8。在本节稍后看到的讨论。
MyISAM基于以上(不再可用)ISAM但有许多有用的扩展存储引擎。
表16.2 MyISAM存储引擎的特点
| 功能特色 | 支持 | 
|---|
| 树索引 | 是 | 
| 在时间点的备份/恢复(实现在服务器中,而不是存储引擎。) | 是 | 
| 群集数据库支持 | 否 | 
| 聚簇索引 | 否 | 
| 压缩数据 | 是的(压缩MyISAM表是仅当使用行压缩格式支持。使用行压缩格式的MyISAM表是只读的。) | 
| 数据高速缓存 | 否 | 
| 数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。) | 是 | 
| 外键的支持 | 否 | 
| 全文搜索索引 | 是 | 
| 地理空间数据类型的支持 | 是 | 
| 地理空间索引支持 | 是 | 
| 哈希索引 | 否 | 
| 索引缓存 | 是 | 
| 锁粒度 | 表 | 
| MVCC | 否 | 
| 复制支持(实现在服务器中,而不是存储引擎。) | 是 | 
| 存储限制 | 256tb | 
| T树索引 | 否 | 
| 交易 | 否 | 
| 更新数据字典数据 | 是 | 
每个MyISAM表存储在磁盘文件中的两。文件名开头的表名和要显示文件类型扩展名。数据文件有一个MVD(MYData)扩展。索引文件的。我(MYIndex)扩展。表定义存储在MySQL数据字典。
显式指定你想要的MyISAM表,表明一个引擎表选项:
CREATE TABLE t (i INT) ENGINE = MYISAM;
在MySQL 8中,通常需要使用ENGINE指定MyISAM因为存储引擎InnoDB是默认的搜索引擎
你可以检查或修理MyISAM表的mysqlcheck客户或myisamchk实用性。你也可以喜剧MyISAM表MyISAMPack占用更少的空间。看到“3,”mysqlcheck一个表的维护计划”,4.6.4“,”myisamchk- MyISAM表维护工具”,和4.6.6“,”MyISAMPack生成的压缩,只读MyISAM表”
在MySQL 8的MyISAM存储引擎没有提供分区支持。分区MyISAM在以前的版本中创建的表MySQL不能使用MySQL 8。有关更多信息,参见第22.6.2,分区限制有关存储引擎”。与升级等表让他们可以使用MySQL 8的帮助,看第2.10.1.2,影响升级到MySQL 8”的变化
MyISAM表具有以下特点:
- 所有的数据值存储与低字节优先。这使得数据的机器和操作系统无关。二元携带唯一的要求是,机器使用有符号二进制补码整数和IEEE浮点格式。在主流机广泛使用的有这些要求。二进制兼容性可能不适用于嵌入式系统,有时有特殊的处理器。 - 有存储数据的低字节先无速度惩罚;表中的行的字节对齐,通常需要更多的处理来读一个对齐字节要比相反的顺序。同时,在服务器端获取列值的代码不是关键时间相比其他代码。 
- 所有数字的键值存储与高字节优先允许更好的索引压缩。 
- 大文件(达63位文件长度)是支持的文件系统,支持大文件的操作系统。 
- 有一个限制(2三十二)二(1.844e 19)中的行- MyISAM表
 
- 每对指标的最大数量- MyISAM表64
 - 每个索引的列数的最大值为16。 
- 最大键长度为1000字节。这也可以通过改变源代码和重新编译了。对于一个关键超过250字节的情况下,一个更大的块尺寸比1024字节默认使用。 
- 行时,插入排序(当你使用的是- AUTO_INCREMENT列),索引树的分裂使高节点只包含一个关键。这提高了索引树的空间利用率。
 
- 一个内部处理- AUTO_INCREMENT每台支撑柱- MyISAM自动更新此列- INSERT和- UPDATEOperations .This makes- 汽车_增量柱的速度(至少10%个)。在顶部的序列值不被删除后重新使用。(当- AUTO_INCREMENT列定义为多列索引的最后一列的值删除,从一个序列上发生的重用。)- 汽车_增量价值可以重置- ALTER TABLE或myisamchk
 
- 动态大小的行不太分散混合时删除与更新和插入。这是通过自动将相邻删除块和延长块如果下一块被删除了。 
- MyISAM支持并发插入:如果一个表中的数据文件中没有空闲块,你可以- INSERT进入新的行在同一时间,其他线程读取表。一个自由块可以作为一个结果,删除行或一个比现在的内容更多的数据长度动态行的更新发生。当所有的空闲块的使用(填写),同时又将成为未来。看到第8.11.3,并发插入”
 
- 你可以把数据文件在不同的目录索引文件在不同的物理设备,以获得更高的速度- DATA DIRECTORY和- 索引目录表选项- CREATE
        TABLE。看到第13.1.18,“创建表的语法
 
- BLOB和- TEXT列可以被索引
 
- NULL在索引列允许值。这需要0到1个字节的密钥。
 
- 每个字符的列可以有不同的字符集。看到10章,字符集Unicode排序规则, 
- 有一个标志- MyISAM索引文件是否被正确关闭表。如果mysqld开始的- --myisam-recover-options选项,- MyISAM表的自动检查和修复打开时,如果表中没有完全关闭。
 
- myisamchk标记表,检查如果你运行它的- --update-state选项myisamchk -快只检查那些表,没有这个标志。
 
- myisamchk -分析存储统计部分的钥匙,以及整个键。 
- MyISAMPack可以包- BLOB和- VARCHAR专栏
 
MyISAM还支持以下功能:
额外资源
下列选项mysqld可以用来改变行为MyISAM表。对于额外的信息,见第5.1.6、“服务器选项”
下面的系统变量的影响的行为MyISAM桌子。For Additional Information,see第5.1.7,服务器“系统变量”
如果你开始激活自动恢复mysqld与--myisam-recover-options选项在这种情况下,当服务器打开一个MyISAM表,检查表是否标记为坠毁是否打开表计数变量不是0你是外部锁定禁用运行服务器。如果这些条件是真的,下面的事情:
- 服务器检查错误的表 
- 如果服务器发现一个错误,它试图做一个快速修表(分类并没有重新创建的数据文件)。 
- 如果因为数据文件中的错误修复失败(例如,一个重复键错误),服务器再次尝试,这次重新创建数据文件。 
- 如果修复仍然失败,服务器尝试再次与老修复选项的方法(写一行一行没有排序)。这种方法应该能够修复任何类型的错误并具有较低的磁盘空间要求。 
如果复苏不可能从以前完成的报表恢复所有行和你没有指定FORCE在的价值--myisam-recover-options选项,自动修复中止错误日志中的错误消息:
错误:无法修复test.g00pages表:
如果你指定FORCE,这样的警告是不是:
警告:发现344 354行时修复。/测试/ g00pages
如果自动回收价值包括BACKUP,恢复过程中创建的表名的文件tbl_name-datetime.bak
MyISAM使用B树索引表。你可以大致计算索引文件的大小为(key_length 4)/ 0.67总结以上所有的钥匙。这是最坏的情况下,当所有的钥匙插入排序和表没有任何压缩键。
字符串索引空间压缩。如果第一个索引部分是一个字符串,它也是前缀压缩。空间压缩使索引文件小于最坏的人物如果字符串列有很多空格或是VARCHAR柱,并不总是充分利用长度。前缀压缩用于键开始与字符串。前缀压缩帮助如果有许多具有相同前缀的字符串。
进入MyISAM表,也可以通过指定前缀压缩数PACK_KEYS=1当你创建表表选项。号码存储与高字节在前,所以这有助于当你有许多整数键,有一个相同的前缀。
16.2.3 Myisam table storagen格式
MyISAM支持三种不同的存储格式。其中,固定和动态格式,自动选择,这取决于你使用的类型的列。三、压缩格式,只能用了MyISAMPack(这utility4.6.6“,”MyISAMPack生成的压缩,只读MyISAM表”)
当你使用CREATE TABLE或ALTER TABLE一张桌子,没有BLOB或TEXT列,你可以强制表的格式固定的或DYNAMIC与row_format表选项
看到第13.1.18,“创建表的语法,有关ROW_FORMAT
你可以解压缩的压缩(解压)MyISAM表格的使用myisamchk--unpack它;4.6.4“,”myisamchk- MyISAM表维护工具”为更多的信息
静态格式是默认的MyISAM表它是用来当表不包含可变长度列(VARCHAR,VARBINARY,BLOB,或TEXT)。每一行都是使用一个固定数量的字节存储。
的三MyISAM存储格式,静态格式是最简单、最安全的(至少对贪污罪主体)。它也是最快的磁盘格式,由于容易,数据文件中的行可以在磁盘:查行根据索引中的行数,乘以行数的行长度计算的行位置。同时,扫描一个表时,它读取一个常数与每个磁盘读操作的行数很容易。
安全证明,如果你的电脑死机而MySQL服务器写入一个固定的格式MyISAM文件在这种情况下,myisamchk可以很容易地确定每一行的开始和结束,所以它通常可以回收除部分写一行。MyISAM表索引总是可以基于数据行重建。
笔记
固定长度的行格式只适用于表而不BLOB或TEXT专栏创建一个表的列一个明确的row_format条款将不会引发错误或警告;格式规范将被忽略。
静态格式表有以下特点:
- CHAR和- VARCHAR列空间填充到指定的列的宽度,虽然列类型不改变。- BINARY和- VARBINARY柱填充- 0x00字节列的宽度
 
- NULL栏目需要额外的空间在连续记录是否值- 无效的。每个- NULL需要一点额外的列,以最接近的字节。
 
- 很快 
- 容易缓存 
- 易于重构之后崩溃,因为行位于固定位置。 
- 重组是必要的除非你大量的行删除,想返回空闲磁盘空间的操作系统。为此,使用- OPTIMIZE TABLE或myisamchk - R的
 
- 通常需要更多的磁盘空间比动态格式表。 
- 预期的行长度字节的静态大小的行是使用下面的公式计算: - row length = 1
             + (- sum of column lengths)
             + (- number of NULL columns+- delete_flag+ 7)/8
             + (- number of variable-length columns)
- delete_flag是一个具有静态行格式表。静态表使用一点行中记录标志,指示该行已被删除。- delete_flag0动态表因为国旗是存储在动态行标题。
 
动态存储格式是用的MyISAM表包含任何可变长度列(VARCHAR,VARBINARY,BLOB,或TEXT),或如果创建表的ROW_FORMAT=DYNAMIC表格选项
动态格式比静态格式更复杂一点,每一行都有一个标题,表明它有多长。一行可以变得支离破碎(存储在不连续的块)时它就不再作为一个更新。
你可以使用OPTIMIZE TABLE或myisamchk - R的整理表。如果你有固定长度列,你访问或表中还包含了一些可变长度列,经常发生变化,这可能是一个好主意,将可变长度列其他表只是为了避免碎片。
动态格式表有以下特点:
- 所有字符串列的动态除长度小于四。 
- 每一行的前面有一个位图指示列包含空字符串(字符串列)或零(数值列)。这不包括列包含- NULL价值观。如果一个字符串列的长度为零空格去除后,或者一个数字列的值为零,它标志着在位图而不是保存到磁盘。非空字符串保存为一个长度字节加字符串内容。
 
- NULL栏目需要额外的空间在连续记录是否值- 无效的。每个- NULL需要一点额外的列,以最接近的字节。
 
- 较少的磁盘空间通常需要比固定长度的表。 
- 每行只使用是需要大的空间。然而,如果行变大,它分裂成许多碎片所造成的碎片,行。例如,如果你更新的信息,扩展行长度的行,列成碎片。在这种情况下,你可能要跑- OPTIMIZE TABLE或myisamchk - R的不时提高性能。使用myisamchk不获得统计表
 
- 比静态格式表更难重建之后崩溃,因为行可能会被分散成许多碎片和链接(碎片)可能会丢失。 
- 动态预期的行长度大小的行是使用下面的公式计算: - 3
+ (- number of columns+ 7) / 8
+ (- number of char columns)
+ (- packed size of numeric columns)
+ (- length of strings)
+ (- number of NULL columns+ 7) / 8
 - 有一个处罚6字节的每个环节。动态行链接每当更新导致的排放大。每个新的链接至少是20个字节,所以接下来的扩大可能在相同的链路。如果不是,另一个链接创建。你可以找到链接使用的数量myisamchk和。所有的链接可能会被删除- OPTIMIZE TABLE或myisamchk - R的
 
MySQL用于存储数据的文件格式已被广泛的测试,但总有可能导致数据库损坏的情况下。下面的讨论描述了这如何发生,如何处理它。
每个MyISAM索引文件(。我文件)在标头,可以用来检查表是否已正确关闭计数器。如果你有以下警告CHECK TABLE或myisamchk,这意味着这个柜台已经不同步:
clients are using or haven't closed the table properly
该警告并不一定意味着表已损坏,但你至少应该检查表。
计数器的工作原理如下:
- 第一次表更新MySQL,在索引文件中的头一个计数器。 
- 计数器是不是在进一步的更新变化。 
- 当一个表的最后一个实例是封闭的(因为- FLUSH TABLES手术或因为在表缓存中没有房间),计数器递减如果表一直在任何时候更新。
 
- 当你修表或检查表,发现它是好的,计数器将重置为零。 
- 避免与其他进程可能检查表交互问题,反不减关闭如果是零。 
换句话说,反能成为错误只有在这些条件下:
这个MEMORY存储引擎(原名堆)创建,存储在存储器中的内容专用表。因为数据是容易死机,硬件问题,或停电,只使用这些表的临时工作区或只读缓存数据从其他表拉。
表16.4内存存储引擎的特点
| 功能特色 | 支持 | 
|---|
| 树索引 | 是 | 
| 在时间点的备份/恢复(实现在服务器中,而不是存储引擎。) | 是 | 
| 群集数据库支持 | 否 | 
| 聚簇索引 | 否 | 
| 压缩数据 | 否 | 
| 数据高速缓存 | N / A | 
| 数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。) | 是 | 
| 外键的支持 | 否 | 
| 全文搜索索引 | 否 | 
| 地理空间数据类型的支持 | 否 | 
| 地理空间索引支持 | 否 | 
| 哈希索引 | 是 | 
| 索引缓存 | N / A | 
| 锁粒度 | 表 | 
| MVCC | 否 | 
| 复制支持(实现在服务器中,而不是存储引擎。) | 有限公司(本节。后来看讨论) | 
| 存储限制 | RAM | 
| T树索引 | 否 | 
| 交易 | 否 | 
| 更新数据字典数据 | 是 | 
开发商希望部署应用程序使用MEMORY存储引擎的重要,高可用性,或经常更新的数据应该考虑是否NDB集群是一个更好的选择。一个典型的使用情况内存引擎涉及这些特点:
NDB集群提供了相同的功能的MEMORY具有较高的性能水平的发动机,并提供额外的功能不可用内存:
- 行级锁定和客户之间的低竞争多线程操作。 
- 可扩展性甚至语句混合,包括写。 
- 可选的磁盘支持的操作数据的耐久性。 
- 无共享架构和多主机操作,无单点故障,使99.999%的可用性。 
- 自动数据分布在各个节点;应用开发者不必手工定制分区或分区方案。 
- 可变长度数据类型的支持(包括- BLOB和- TEXT)不支持- 内存
 
MEMORY性能约束的竞争从单线程执行和表锁时的开销处理更新。这限制了可扩展性,当负荷增加,特别是对语句的混合,包括写。
尽管在内存中处理MEMORY表,他们并不比一定更快InnoDB在一个繁忙的服务器表、通用查询,或在一个读/写的工作量。特别是,表锁定参与执行更新可以减缓并行使用内存从会话表的多
根据对查询的种类MEMORY表,你可以创建指标为默认哈希数据结构(查找基于独特的关键单值),或一个通用的B树的数据结构(各种涉及平等,不平等,或范围的运营商如小于或大于)查询。以下各节说明创建指标两种语法。一种常见的性能问题是负载在B-树索引是更有效的使用默认哈希索引。
这个MEMORY存储引擎不创建磁盘上的任何文件。表定义存储在MySQL数据字典。
MEMORY表具有以下特点:
- 空间- MEMORY表中分配块。表100为使用动态散列插入。没有溢出区或额外需要的密钥空间。自由列表不需要额外的空间。放在一个链表中删除行和重复使用,当你插入到新的数据表。- 内存表格也有常用的删除和插入哈希表的相关问题没有。
 
- MEMORY表使用一个固定长度的行存储格式。可变长度的类型,如- VARCHAR使用一个固定长度的存储。
 
- MEMORY表中不能包含- BLOB或- TEXT专栏
 
- MEMORY包括支持- 汽车_增量专栏
 
- 非—- TEMPORARY- 内存表中所有客户共享,就像任何其他非—- TEMPORARY表
 
创建一个MEMORY表,指定条款ENGINE=MEMORY上CREATE TABLE声明
CREATE TABLE t (i INT) ENGINE = MEMORY;
通过发动机的名称说明,MEMORY表存储在内存中。他们使用哈希索引默认情况下,这让他们很快的单值查询,并创建临时表很有用。然而,当服务器关闭时,所有的行存储在内存表丢了。表本身的继续存在,因为他们的定义存储在MySQL数据字典,但他们有空的时候重新启动服务器。
这个例子展示了如何可以创建,使用和删除MEMORY表
MySQL的>CREATE TABLE test ENGINE=MEMORY->SELECT ip,SUM(downloads) AS down->FROM log_table GROUP BY ip;MySQL的>SELECT COUNT(ip),AVG(down) FROM test;MySQL的>DROP TABLE test;
最大尺寸MEMORY表是有限的max_heap_table_size系统变量,其中有16MB的默认值。执行不同的大小限制内存表,更改此变量的值。值的影响CREATE TABLE随后,或ALTER TABLE或TRUNCATE TABLE,用于表的生命价值。重新启动服务器还设置存在的最大尺寸内存表全球max_heap_table_size价值。你可以设置大小为单个表在本节后面介绍。
这个MEMORY存储引擎支持搞砸和BTREE指标。你可以指定一个或另一个对于一个给定的指数增加使用条款如下所示:
CREATE TABLE lookup
    (id INT, INDEX USING HASH (id))
    ENGINE = MEMORY;
CREATE TABLE lookup
    (id INT, INDEX USING BTREE (id))
    ENGINE = MEMORY;
对于B树和哈希索引的一般特点,看第8.3.1,“MySQL如何使用索引”
MEMORY表最多可以有64个指标,每个表,每个索引16列和最大密钥长度3072字节。
如果一个MEMORY表散列索引具有高度复制钥匙(很多索引条目包含相同的值),更新影响关键值表,删除明显慢。这次衰退的程度是重复程度成正比(或反比指标基数)。你可以使用一个B树索引可以避免这个问题。
MEMORY表可以有唯一的钥匙。(这是一种罕见的哈希索引。实现的功能)
被索引的列可以包含NULL价值观
MEMORY表格的内容存储在内存中,这是一个属性,内存内部临时表,服务器创建的飞在处理查询份额表。然而,这两类表的区别在于MEMORY表不受存储转换,而内部临时表:
服务器的MEMORY表成空时,关闭并重新启动。如果服务器的复制,它的奴隶并没有意识到这些表都成空,所以你看过时的内容如果你选择从奴隶的表中的数据。同步主从内存表,当MEMORY桌子是用一个启动以来第一次的主人,一个DELETE声明是写给师父的二进制日志,空桌上的奴隶也。奴隶仍然在表上有过时的数据在主人之间的间隔启动和首次使用的表。为了避免这一区间时,奴隶直接查询可以返回过期数据,使用--init-file选择填充内存在启动主表
服务器需要足够的内存来保存所有MEMORY表,在使用的同时
记忆不是再生如果你删除单个行的MEMORY表只有当内存回收整个表格被删除。记忆,是以前用于删除的行被重新用于新的行相同的表内。释放所有内存使用的内存表当你不再需要它的内容,执行DELETE或TRUNCATE TABLE删除所有行,或删除完全使用表DROP
      TABLE。自由被删除的行使用的内存使用ALTER TABLE ENGINE=MEMORY力表重建
在一行所需要的存储器MEMORY桌子是用以下公式计算:
sum_over_all_btree_keys(max_length_of_keysizeof(char *)* 4)sum_over_all_hash_keys(sizeof(char *)*(2)对齐length_of_row1,sizeof(char *))
ALIGN()表示一个圆的因素导致的行长度是一个确切的多烧焦指针的大小sizeof(char*)4位机和64位机8
如前所述,该max_heap_table_size系统变量设置的最大大小的限制内存表为了控制单个表的最大大小,设置这个变量的值在创建会话的每个表。(不改变全球max_heap_table_size除非你打算要使用的值内存所有的客户创建的表。)下面的示例创建两个MEMORY表,一个1MB和2MB的最大大小,分别:
MySQL的>SET max_heap_table_size = 1024*1024;查询好,为受影响的行(0.001秒)MySQL >CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;查询好,为受影响的行(0.01秒)MySQL >SET max_heap_table_size = 1024*1024*2;查询好,为受影响的行(0.001秒)MySQL >CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;查询行,0行受影响(0秒)
表恢复到服务器的全球max_heap_table_sizerestarts value if the server。
你也可以指定一个MAX_ROWS表选项CREATE TABLE报表内存表提供了一个关于你的计划行存储在他们的一些提示。这不会使表的增长超出了max_heap_table_size值,它仍然作为最大表大小限制。最大的灵活性,能够使用max_rows,集max_heap_table_size至少为高价值,希望每个内存表格能够成长
这个CSV使用逗号分隔值格式文本文件存储引擎存储数据。
这个CSV存储引擎是编译到MySQL服务器。
检查源的CSV发动机,看在存储/ CSV一个MySQL源分布目录。
当你创建一个CSV表,服务器会创建一个数据文件。数据文件的名字开头的表名和有.csv扩展数据文件是纯文本文件。当你存储数据的表,存储引擎将其保存为以逗号分隔的值格式的数据文件。
mysql> CREATE TABLE test (i INT NOT NULL, c CHAR(10) NOT NULL)
    -> ENGINE = CSV;
Query OK, 0 rows affected (0.12 sec)
mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM test;
+------+------------+
| i    | c          |
+------+------------+
|    1 | record one |
|    2 | record two |
+------+------------+
2 rows in set (0.00 sec)
创建一个CSV表格也会产生一个相应的文件存储表的状态和表中的行数,存在。该文件的名称与扩展的表的名称相同CSM
如果你检查test.CSV在执行上面的语句创建数据库目录的文件,其内容应该是这个样子的:
“1”、“记录”的“2”,“记录”
这种格式可以读,甚至写的电子表格应用程序,如微软Excel或StarOffice的计算。
CSV存储引擎支持CHECK和修复报表验证尽可能修复受损的CSV表格。
当运行CHECK声明中,CSV文件将通过寻找正确的字段分隔符的有效性检查,逃田(匹配或引号),字段的正确数与表定义和相应的CSV文件的存在。第一个无效行发现将报告一个错误。检查有效表产生的输出如下所示:
MySQL的>check table csvtest;-------------- ------- ---------- ---------- |表| OP | msg_type | msg_text | -------------- ------- ---------- ---------- | test.csvtest |检查|状态|好| -------------- ------- ---------- ---------- 1行集(0秒)
对损坏的表检查返回的故障:
mysql> check table csvtest;
+--------------+-------+----------+----------+
| Table        | Op    | Msg_type | Msg_text |
+--------------+-------+----------+----------+
| test.csvtest | check | error    | Corrupt  |
+--------------+-------+----------+----------+
1 row in set (0.01 sec)
如果检查失败,表中被标记为坠毁(腐败)。一旦一个表被标记为损坏,它会自动修复时,你的下一次CHECK或执行SELECT声明。相应的腐败现状和新的状态将显示在运行检查:
mysql> check table csvtest;
+--------------+-------+----------+----------------------------+
| Table        | Op    | Msg_type | Msg_text                   |
+--------------+-------+----------+----------------------------+
| test.csvtest | check | warning  | Table is marked as crashed |
| test.csvtest | check | status   | OK                         |
+--------------+-------+----------+----------------------------+
2 rows in set (0.08 sec)
修表你可以使用REPAIR这个副本,从现有的CSV数据尽可能多的有效行,然后替换现有的CSV文件的恢复行。任何行超出损坏数据丢失。
MySQL的>repair table csvtest;-------------- -------- ---------- ---------- |表| OP | msg_type | msg_text | -------------- -------- ---------- ---------- | test.csvtest |修复|状态|好| -------------- -------- ---------- ---------- 1行集(0.02秒)
警告
在修复过程中,只有从CSV文件的第一行到损坏的行复制到新表。从第一个损坏排到端上餐桌的所有其他行被删除,即使是合法的行。
这个CSV存储引擎不支持索引
这个CSV存储引擎不支持分区
您创建的所有表的使用CSV存储引擎必须有不为空在所有的列属性。然而,为了向后兼容,可以继续使用表可为空的列,在以前的MySQL版本创建。(错误# 32050)
这个BLACKHOLE存储引擎作为一个“黑洞“接受数据,但把它扔掉,不存储它。检索总是返回空的结果:
mysql> CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM test;
Empty set (0.00 sec)
为了使BLACKHOLE如果你建立MySQL存储引擎源码,调用CMake与-DWITH_BLACKHOLE_STORAGE_ENGINE选项
检查源的BLACKHOLE发动机,看在SQL一个MySQL源分布目录。
当你创建一个BLACKHOLE表,服务器创建的表中定义的全局数据字典。没有与表关联的文件。
这个BLACKHOLE存储引擎支持各种指标。那就是,你可以在表定义索引的声明。
这个BLACKHOLE存储引擎不支持分区
你可以检查是否BLACKHOLE存储引擎是可用的SHOW
    ENGINES声明
插入一个BLACKHOLE表格不存储任何数据,但是如果声明为基础的二进制日志功能,SQL语句被复制到从服务器。这可以作为一个有用的转发或过滤机制。
假设你的应用程序需要从侧过滤规则,但将所有二进制日志数据从第一个结果太多的交通。在这种情况下,可以设置在主主机“笨蛋“从进程的默认存储引擎BLACKHOLE,描述如下:
大师写的二进制日志。这个“笨蛋“mysqld过程作为一个奴隶,应用所需的组合replicate-do-*和复制- ignore *规则,并写了一个新的,过滤自己的二进制日志。(见第17.1.6,“复制和二进制日志记录选项和变量”。)这过滤日志提供给奴隶。
虚拟过程实际上并不存储任何数据,因此很少有处理开销,通过运行额外的费用mysqld在复制主机进程。这种设置可以重复的额外复制的奴隶。
INSERT触发器黑洞表象预期的那样工作。然而,由于BLACKHOLE表实际上并不存储任何数据,UPDATE和DELETE触发器不激活的每一行在触发器定义条款不适用,因为没有行。
对于其他可能的用途BLACKHOLE存储引擎包括:
这个BLACKHOLE发动机是交易的意识,在某种意义上说,已提交的事务写入二进制日志、回滚事务不。
黑洞引擎和自动递增列
黑洞引擎是一个没有运算引擎。任何操作使用黑洞在桌子上就没有效果。这应该牢记在考虑主键列,自动增量的行为。发动机不会自动递增字段的值,而不保留自动递增字段状态。这在复制中具有重要的意义。
考虑下面的复制场景,以下所有三个条件适用:
- 在主服务器上有一个自动递增字段是主键的黑洞表。 
- 在从同一个表存在但使用MyISAM引擎。 
- 插入行到主人的桌子没有显式设置在自动增量值- INSERT语句本身或通过使用一个- 集insert_id声明
 
在这种情况下,复制将失败,在主键列上重复录入错误。
在基于语句的复制,价值INSERT_ID在上下文事件永远是相同的。复制将因此由于试图插入一行一个主键列值重复失败。
在基于行的复制,使引擎返回的行始终是相同的每个插入值。这将导致在奴隶试图重放两插入日志条目使用相同的值的主键列,所以复制将失败。
柱过滤
使用基于行的复制时,(binlog_format=ROW),一个奴隶在最后一列的缺失表支持,在部分的描述第17.4.1.9,“复制不同的表定义在大师和Slave”
这种过滤对奴隶的一面,即列复制到奴隶才被过滤掉。至少有两种情况下,这是不可取的复制列的奴隶:
- 如果数据是保密的,所以从服务器不应该访问它。 
- 如果主人有许多奴隶,过滤之前发送到奴隶可以减少网络流量。 
主柱过滤可以实现用BLACKHOLE引擎这是一个方式是实现类似于主表过滤进行使用黑洞发动机和--replicate-do-table或--replicate-ignore-table选项
为掌握安装:
CREATE TABLE t1 (public_col_1, ..., public_col_N,
                 secret_col_1, ..., secret_col_M) ENGINE=MyISAM;
对于受信任的建立是奴隶:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=BLACKHOLE;
对于不受信任的建立是奴隶:
CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=MyISAM;
这个MERGE存储引擎,也被称为MRG _ MyISAM发动机,是一个集相同MyISAM表格可以作为一个“相同“意味着所有的表具有相同的列的数据类型和索引信息。无法合并MyISAM表中的列以不同的顺序列出,不在相应的列具有相同的数据类型,或以不同的顺序有指标。然而,任何或所有的MyISAM表格可以压缩MyISAMPack。看到4.6.6“,”MyISAMPack生成的压缩,只读MyISAM表”。表之间的差异等这些并不重要:
另一种方法MERGE表分区表,它存储在单独的文件中的一个表分区,使一些操作能更有效地执行。有关更多信息,参见22章,分区
当你创建一个MERGE创建一个表,MySQLMRG在磁盘上包含的基本名称的文件MyISAM表应作为一。本表格式合并表存储在MySQL数据字典。基础表不一定要在同一数据库为MERGE表
你可以使用SELECT,DELETE,UPDATE,和INSERT打开(放)合并表你必须有SELECT,DELETE,和UPDATE上的特权MyISAM在你的地图上MERGE表
笔记
使用MERGE表包含以下安全问题:如果一个用户访问MyISAM表t,用户可以创建一个合并表m访问t。但是,如果用户的特权t随后被撤销,用户可以继续访问t这样,通过m
使用DROP TABLE用一个合并表滴只有MERGE规格基础表不受影响
创建一个MERGE表格,你必须指定一个UNION=(list-of-tables)选项说明MyISAM表格的使用。你可以选择指定一个INSERT_METHOD选择插入到如何控制合并表发生。使用价值FIRST或最后使刀片将在第一个或最后一个基本表,分别。如果你不指定INSERT_METHOD如果你选择或指定一个值不,插入MERGE表是不允许的,这样的做法在一个错误的结果。
下面的示例演示如何创建一个MERGE表
MySQL的>CREATE TABLE t1 (->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,->message CHAR(20)) ENGINE=MyISAM;MySQL的>CREATE TABLE t2 (->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,->message CHAR(20)) ENGINE=MyISAM;MySQL的>INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');MySQL的>INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');MySQL的>CREATE TABLE total (->a INT NOT NULL AUTO_INCREMENT,->message CHAR(20), INDEX(a))->ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
专栏a索引作为一个主键在底层MyISAM表,但不在合并表这是索引,而不是作为一个PRIMARY KEY因为一个合并表格不能强制对基础表的集合的唯一性。(同样,一柱一UNIQUE在基础表中指标应编入合并表而不是一个UNIQUE索引
在创建MERGE表格,你可以用它来发出查询操作表的组作为一个整体:
MySQL的>SELECT * FROM total;--- --------- |一|消息| --- --------- | 1 |测试| | 2 |表| |三| T1 | | 1 |测试| | 2 |表| |三| T2 | --- ---------
来重新映射MERGE表不同的集合MyISAM表,您可以使用下列方法之一:
基本表的定义和指标必须符合密切的定义MERGE表一致性检查的一部分,是一个当桌子合并表打开,并不时MERGE表的创建。如果任何表的一致性检查失败,引发表的打开操作失败。这意味着在一个表的定义的变化合并可能导致失败的时MERGE表的访问。一致性检查每个表的应用:
如果一个MERGE表无法打开或使用因为与基础表的问题,CHECK
    TABLE显示有关信息表引起的问题。
额外资源
MERGE表格可以帮助您解决以下问题:
- 轻松管理一组日志表。例如,你可以把数据从不同的月成单独的表,压缩一些人MyISAMPack,然后创建一个- MERGE表作为一个
 
- 获得更高的速度。你可以把一些标准为基础的大型只读的表,然后把各个表在不同的磁盘上。一- MERGE表格这种方式可能比使用一个单一的大表快得多。
 
- 执行更有效的搜索。如果你知道你正在寻找什么,你可以只是其中的一些查询基本表的搜索和使用- MERGE表的人。你甚至可以有许多不同的- 合并表使用重叠套表
 
- 执行更高效的维修。这是更容易修复个体较小的表映射到- MERGE表比修复一个大桌子
 
- instantly地图多表有一个。A- MERGE表格不需要维护自己的指标,因为它使用的单个表的索引。因此,- 合并表集合非常快速创建或重新映射。(你还必须指定索引的定义,当你创建一个- MERGE表,即使没有创建索引。)
 
- 如果你有一套表由你创造需求,一个大桌子,你可以创建一个- MERGE表从他们的需求。这是速度更快,节省了大量的磁盘空间。
 
- 超过操作系统的文件大小限制。每个- MyISAM表是由这个限制的约束,但收集的- MyISAM表不
 
- 你可以一个一个别名或同义词的创建- MyISAM通过定义一个表- 合并表映射到单个表。不应该有很显著的性能影响做这(只有一对夫妇的间接调用- memcpy()每读电话)
 
的缺点MERGE表:
- 你可以使用相同的- MyISAM为表- 合并表
 
- 一些- MyISAM功能无效- 合并表例如,您不能创建- FULLTEXT指标- 合并表(你可以创建- FULLTEXT对基础指标- MyISAM表,但你不能搜索- MERGE与全文检索表。)
 
- 如果- MERGE表是永久,所有的底层- MyISAM表格必须是非定时的。如果- MERGE桌子是暂时的- MyISAM表格可以任意组合的临时和永久。
 
- MERGE表格中使用多个文件描述符比- MyISAM表。如果在10 clients are using- MERGE表映射到10台,服务器使用(10×文件描述符10)10。(10数据文件描述符的10个客户,和10的索引文件描述符之间共享的客户。)
 
- 索引读取速度较慢。当你读到一个指数的- MERGE存储引擎需要问题的所有基本表读取检查哪一个最符合一个给定的索引值。读下一个索引值,该- 合并存储引擎需要搜索读取缓冲区中寻找下一个值。只有当一个索引缓冲区是用来存储引擎需要读取下一个索引块。这使得- MERGE指标要慢得多- eq_ref搜索,但不太慢- ref搜索为更多的信息关于- eq_ref和- ref,看到第13.8.2,”解释语法”
 
以下是已知的问题MERGE表
- 在MySQL服务器版本之前5.1.23,可以创建临时表与非临时孩子MyISAM表的合并。 - 从5.1.23合并版本,孩子们通过父表锁定。如果父母是暂时的,它没有上锁,孩子们也不锁。的MyISAM表并行使用损坏它们。 
- 如果你使用- ALTER TABLE改变- 合并表到另一个存储引擎,映射到基础表丢了。相反,从底层的行- MyISAM表复制到更改表,然后使用指定的存储引擎。
 
- 这个- INSERT_METHOD一个表的选择- 合并表指示标- MyISAM使用插入表格- 合并表中。但是,在使用中- AUTO_INCREMENT该表的选项- MyISAM桌上有没有影响插入- MERGE表直到至少一行被直接插入- MyISAM表
 
- 一- MERGE表格不能保持唯一性约束在整个表。当你执行一个- INSERT,数据进入第一个或最后一个- MyISAM表(确定的- INSERT_METHOD选项)。MySQL确保独特的核心价值是独特的- MyISAM表,但不是所有的底层表集合中。
 
- 因为- MERGE发动机不能强制对基础表的集合的唯一性,- REPLACE没有象预期的那样工作。两个关键事实:
 - 类似的考虑也适用于- INSERT
          ... ON DUPLICATE KEY UPDATE
 
- MERGE不支持分区表。那就是,你不能分割- 合并表,也没有任何一个- MERGE表的基础- MyISAMpartitioned表好。
 
- 你不应该使用- ANALYZE
          TABLE,- REPAIR TABLE,- OPTIMIZE TABLE,- ALTER TABLE,- DROP TABLE,- DELETE没有一个- 哪里条款,或- TRUNCATE TABLE对那些被映射到一个打开的表- 合并表如果你这样做的- MERGE表可能仍然是指原始表和产生意外的结果。要解决此问题,确保没有- 合并表保持开放,通过发行- FLUSH TABLES执行任何指定的操作事先声明。
 - 意想不到的结果,包括在操作的可能性- MERGE表格将报告表损坏。如果这发生在一个名叫操作的基础- MyISAM表格、腐败的信息是虚假的。为了解决这一问题,问题- FLUSH TABLES修改后的声明- MyISAM表
 
- DROP TABLE在表格中使用的- 合并表不工作在Windows因为- MERGE存储引擎的表映射隐藏从MySQL上层。Windows不允许打开的文件被删除,所以你必须先冲洗所有- 合并的- FLUSH TABLES)或降- 合并在删除表表
 
- 的定义- MyISAM表和- 合并表检查表被访问时(例如,作为一个- SELECT或- INSERT声明)。检查确保表和母公司的定义- 合并表定义的列顺序匹配比较,类型,大小和相关指标。如果表之间有差异,则返回一个错误的语句失败。因为这些检查发生在表打开,对一个表中定义的任何变化,包括列变化,列排序,和发动机的改变将导致语句失败。
 
- 在索引的顺序- MERGE表、底层表应该是一样的。如果你使用- ALTER TABLE添加一个- 独特used in a索引表- MERGE表格,然后使用- ALTER TABLE在添加一个非唯一索引- 合并表,如果已经有一个非唯一索引基础表中的索引排序是不同的表。(这是因为- ALTER TABLE放- 独特指标在非唯一索引便于重复键快速检测。)因此,在这样的索引的表的查询可能返回意外的结果。
 
- 如果你遇到类似的错误信息错误1017(hy000):找不到文件:”- tbl_nameMRG”。(errno:2)通常,这表明一些潜在的表不使用- MyISAM存储引擎。确认所有这些表- MyISAM
 
- 行的最大数目- MERGE表2六十四(~ 1.844e 19;同一- MyISAM表)。这是不可能的合并多个- MyISAM在单表- MERGE表,会有比这更多的行数。
 
- 利用基础- MyISAM不同的行格式与父表- 合并表是目前已知的失败。看到错误# 32364。
 
- 你不能改变一个永久的联盟名单- MERGE表时- LOCK
          TABLES在影响。以下是不工作
 - CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...;
LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE;
ALTER TABLE m1 ... UNION=(t1,t2) ...;
 - 然而,你可以做一个临时的- MERGE表
 
- 您不能创建一个- MERGE表- 创造选择,无论是作为一个临时的- MERGE表,也不是一个永久- 合并表。例如:
 - CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...; - 试图在一个错误的结果做这:- tbl_name是不是- 基表
 
- 在某些情况下,不同的- PACK_KEYS表格中的选项值- 合并与基础表导致意外的结果如果基础表包含- CHAR或- 二元的专栏作为一种替代方法,使用- ALTER TABLE确保所有相关的表有相同的- _把钥匙值。(错误# 50646)
 
这个FEDERATED存储引擎可以访问从远程MySQL数据库的数据复制或不使用集群技术。查询本地联邦表格自动将数据从远程(联邦)表。没有数据存储在本地表。
包括FEDERATED如果你建立MySQL存储引擎源码,调用CMake与-DWITH_FEDERATED_STORAGE_ENGINE选项
这个FEDERATED通过在运行的服务器的默认没有启用存储引擎;使联邦,你必须启动MySQL服务器的二进制使用--federated选项
检查源的FEDERATED发动机,看在存储/联合一个MySQL源分布目录。
当你创建一个表,使用一个标准的存储引擎(如MyISAM,CSV或InnoDB),表由表定义和相关的数据。当你创建一个联邦表,表的定义是相同的,但是数据的物理存储在远程服务器上处理。
一FEDERATED表由两元素:
当执行查询和报表上FEDERATED在本地服务器上的操作,通常会插入、更新或删除信息从本地数据文件而不是发送到执行远程服务器,在那里他们更新远程服务器上或从远程服务器匹配行的数据文件。
一个基本的结构FEDERATED表格设置显示图16.2,“密表结构”
当客户端发出的SQL语句,指的是一个FEDERATED表,地方的信息服务器之间的流量(在SQL语句执行)和远程服务器(如数据存储)如下:
- 存储引擎看起来通过每一列的- FEDERATED表构建一个适当的SQL语句是指远程表。
 
- 声明是使用MySQL客户端API发送到远程服务器。 
- 远程服务器处理报表和本地服务器检索任何结果,语句产生(受影响的行数或结果集)。 
- 如果语句产生一个结果集,每列转换为内部格式,存储引擎- FEDERATED发动机预计可用于显示结果,发出原始语句的客户端。
 
本地服务器使用MySQL客户端C API函数的远程服务器进行通信。它调用mysql_real_query()发声明。读一个结果集,它使用mysql_store_result()取行一次使用mysql_fetch_row()
创建一个FEDERATED表你应该遵循这些步骤:
- 创建远程服务器上的表。或者,让一个现有的表的表定义的一个注,也许使用- SHOW CREATE TABLE声明
 
- 创建具有相同的表定义本地服务器上的表,但是添加链接本地表的远程表的连接信息。 
例如,您可以创建远程服务器上的表:
CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=MyISAM
DEFAULT CHARSET=utf8mb4;
创建表的地方,将联合远程表,有两个选项。您可以创建本地表和指定连接字符串(包含服务器名称、登录密码)是用来连接到远程表的使用CONNECTION,或者你可以使用现有的连接,您以前创建使用CREATE SERVER声明
重要
当你创建表的地方吧必须有一个相同的字段定义的远程表。
笔记
你可以改善的性能FEDERATED通过添加索引的表的主表。优化会因为发送到远程服务器的查询将包括的内容哪里条款将被发送到远程服务器,然后本地执行。这减少了网络流量,否则局部处理服务器请求的整个表。
使用第一种方法,您必须指定CONNECTION在发动机后的字符串类型CREATE TABLE声明。例如:
CREATE TABLE federated_table (    id     INT(20) NOT NULL AUTO_INCREMENT,    name   VARCHAR(32) NOT NULL DEFAULT '',    other  INT(20) NOT NULL DEFAULT '0',    PRIMARY KEY  (id),    INDEX name (name),    INDEX other_key (other))ENGINE=FEDERATEDDEFAULT CHARSET=utf8mb4CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
笔记
CONNECTION取代评论在以前的一些版本的MySQL。
这个CONNECTION字符串包含要连接到包含将被用于物理上存储数据的表的远程服务器的信息。连接字符串中指定的服务器名称,登录凭据,端口号和数据库表的信息。在这个例子中,远程服务器上的表remote_host,使用端口9306。的名称和端口号的主机名匹配(或IP地址)和远程MySQL服务器实例作为您的远程桌面端口号。
连接字符串的格式如下:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
哪里:
- scheme:一个公认的连接协议。只有- MySQL是支持的- scheme在这一点上的价值
 
- user_name:用于连接的用户名称。该用户必须已经在远程服务器上创建的,必须有合适的权限来执行所需的行动(- SELECT,- INSERT,- UPDATE这是一个很好的东西
 
- password:(可选)对应的密码- user_name
 
- host_name:主机名或远程服务器的IP地址。
 
- port_num:(可选)为远程服务器的端口号。默认值是3306。
 
- db_name控股公司:the name of the database远程表。
 
- tbl_name:远程表的名称。对本地和远程表的名称不匹配。
 
示例连接字符串:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
如果你正在创建一个数FEDERATED同一服务器上的表,或者如果你想简化创建过程联邦表格,你可以使用CREATE SERVER语句定义服务器的连接参数,就像你的联系字符串
的格式CREATE SERVER语句:
创建服务器server_name国外的数据包wrapper_name选项(option【,option]…)
这个server_name用于连接字符串时创建一个新的联邦表
例如,创建一个服务器连接相同的CONNECTION字符串:
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
你可以使用下面的语句:
CREATE SERVER fedlink
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'fed_user', HOST 'remote_host', PORT 9306, DATABASE 'federated');
创建一个FEDERATED表格使用这个连接,你仍然可以使用的联系关键词,但是指定你使用的名称CREATE SERVER声明
CREATE TABLE test_table (    id     INT(20) NOT NULL AUTO_INCREMENT,    name   VARCHAR(32) NOT NULL DEFAULT '',    other  INT(20) NOT NULL DEFAULT '0',    PRIMARY KEY  (id),    INDEX name (name),    INDEX other_key (other))ENGINE=FEDERATEDDEFAULT CHARSET=utf8mb4CONNECTION='fedlink/test_table';
在这个例子中的连接名称包含的连接名称(fedlink)和表的名称(test_table)连接,由斜杠分隔。如果你只指定的连接名称没有表名,表的地方表的名字代替。
更多信息CREATE
        SERVER,看到第13.1.16,“创建服务器语法”
这个CREATE SERVER语句接受相同的参数为联系字符串这个CREATE SERVER声明更新行的mysql.servers表见下表中的连接字符串参数之间的对应信息,选择在CREATE
        SERVER声明,并在列mysql.servers表。参考“格式”CONNECTION字符串如下:
scheme:/ /user_name【:password] @host_name【:port_num] /db_name/tbl_name
你应该注意以下几点在使用FEDERATED存储引擎:
以下显示的特点,FEDERATED存储引擎不支持:
- 远程服务器必须是一个MySQL服务器。 
- 一个远程表- FEDERATED表点必须你试图通过访问表之前就存在- FEDERATED表
 
- 一是可能的- FEDERATED表点到另一个,但你必须小心不要创建一个循环。
 
- 一- FEDERATED表不支持指标在通常意义上的;因为访问表数据的远程处理,它实际上是远程表,利用指标。这意味着,对于一个查询,不能使用任何指标,因此需要全表扫描,服务器从远程表和过滤器局部取所有行。这无论发生任何- 哪里或- LIMIT用这个- SELECT声明;这些条款是局部使用返回的行。
 - 查询不使用索引可以导致业绩不佳和网络过载。此外,由于返回的行必须存储在内存中,这样的查询也能导致本地服务器交换,甚至挂。 
- 应注意,当创建一个- FEDERATED从等效指标定义表- MyISAM或其他表可能不支持。例如,创建一个- FEDERATED表的索引前缀- VARCHAR,- TEXT或- BLOB列会失败。下面的定义- MyISAM在选择:
 - CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=MYISAM; - 在这个例子中关键的前缀是不相容的- FEDERATED发动机,和等价的语句将失败:
 - CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=FEDERATED  CONNECTION='MYSQL://127.0.0.1:3306/TEST/T1'; - 如果可能的话,你应该尝试不同的列和索引定义创建对远程服务器和避免这些指标问题的本地服务器上桌时。 
- 在内部,实现使用- SELECT,- INSERT,- UPDATE,和- DELETE,但不- HANDLER
 
- 这个- FEDERATED存储引擎支持- SELECT,- INSERT,- UPDATE,- DELETE,- TRUNCATE TABLE,和指标。它不支持- ALTER TABLE,或任何数据定义语言,直接影响表的结构,除了- DROP TABLE。当前实现不使用预处理语句。
 
- FEDERATED接受- INSERT
          ... ON DUPLICATE KEY UPDATE报表,但如果发生复制钥匙的侵害,该语句将失败与错误。
 
- 不支持交易 
- FEDERATED执行大容量插入处理等多个行发送到远程表在一个批处理,从而提高性能。另外,如果远程表是事务性的,它使远程存储引擎执行语句回滚应该出现错误。这种能力具有以下的局限性:
 
- 是没有办法的- FEDERATED引擎知道远程表已经改变。原因是这台必须像一个数据文件,将不会被任何东西比其他数据库系统来写。在当地表数据的完整性被破坏如果有远程数据库的任何变化。
 
- 当使用- CONNECTION字符串,你不能在密码中使用的字符'@'。你可以绕过这个限制使用- CREATE
          SERVER语句创建一个服务器连接。
 
- 这个- insert_id和- timestamp选项不传播到数据提供商。
 
- 任何- DROP TABLE发表反对声明- 联邦表滴只有本地表,没有远程表。
 
- FEDERATED表格不查询缓存的工作。
 
- 用户定义的分区不支持- FEDERATED表
 
下列额外的资源是可用的FEDERATED存储引擎:
这个EXAMPLE存储引擎是一个存根引擎,不。它的目的是作为一个例子,在MySQL源代码说明了如何开始编写新存储引擎。因此,它主要是开发人员的兴趣。
为了使EXAMPLE如果你建立MySQL存储引擎源码,调用CMake与-DWITH_EXAMPLE_STORAGE_ENGINE选项
检查源的EXAMPLE发动机,看在存储/例子一个MySQL源分布目录。
当你创建一个EXAMPLE表,没有文件的创建。没有数据可以存储在表中。检索返回空的结果。
MySQL的>CREATE TABLE test (i INT) ENGINE = EXAMPLE;查询行,0行受影响(0.78秒)MySQL >INSERT INTO test VALUES(1),(2),(3);错误1031(hy000):'测试'不?表存储引擎有optionmysql >SELECT * FROM test;空集合(0.31秒)
这个EXAMPLE存储引擎不支持索引
这个EXAMPLE存储引擎不支持分区
其他存储引擎可以提供来自第三方的社区成员,使用自定义的存储引擎接口。
第三方引擎不支持MySQL。为进一步的信息、文档、安装指南、错误报告或任何帮助或协助这些引擎,请直接联系发动机的开发。
在开发一个客户的存储引擎,可以使用可插拔的存储引擎架构的更多信息,参见MySQL内核:编写一个自定义的存储引擎
MySQL插件式存储引擎的架构使数据库的专业选择为特定的应用需要专门的存储引擎而被完全屏蔽的需要任何特定的应用程序要求编码管理。MySQL服务器体系结构将应用程序员和DBA从所有的底层实现细节在存储层,提供一致的和简单的应用模型和API。因此,虽然有不同的存储引擎不同的能力,应用屏蔽这些差异。
可插拔的存储引擎体系结构提供了一套标准的管理,是常见的所有底层存储引擎中支持服务。存储引擎本身是组件的数据库服务器,实际执行操作的基础数据保持在物理服务器级别。
这种高效的、模块化的架构提供了那些专门针对特定的应用需要,如数据仓库、事务处理的巨大利益,或高可用性的情况下同时享受使用一组接口和服务,是独立于任何一个存储引擎的优势。
应用程序员和DBA的MySQL数据库交互通过连接器API和服务层,上面的存储引擎。如果应用程序的变化带来的要求,要求底层存储引擎,或一个或多个存储引擎被加入来支持新的需求,没有明显的编码或过程变化的需要做的工作。MySQL服务器体系结构屏蔽应用的存储引擎的底层复杂性呈现一致的和易于使用的API,适用于存储引擎。
MySQL服务器使用一个可插拔的存储引擎的架构,使存储引擎被装入和卸载从运行MySQL服务器。
插入一个存储引擎
在一个存储引擎可以使用,存储引擎插件共享库必须加载到MySQL的使用INSTALL PLUGIN声明。例如,如果例子引擎插件命名example和共享库的命名ha_example.so,你把它用下面的语句:
INSTALL PLUGIN example SONAME 'ha_example.so';
安装一个可插拔的存储引擎,插件文件必须位于MySQL插件目录,并且用户发布INSTALL PLUGIN语句必须有INSERT特权的mysql.plugin表
共享库必须位于MySQL服务器插件目录,其位置是由plugin_dir系统变量
多个存储引擎
拔出存储引擎,使用UNINSTALL PLUGIN声明:
卸载插件的例子;
如果你拔掉存储引擎,是由现有的表,这些表变得不可访问,但仍将在磁盘上存在(如适用)。确保没有表使用的存储引擎在你拔出存储引擎。
MySQL插件式存储引擎是MySQL数据库服务器,负责执行实际的数据I/O操作的数据库以及启用和执行一定的功能集,针对特定应用需要的组件。使用特定的存储引擎的主要好处是,你只交付一个特定的应用程序所需的功能,因此你在数据库系统开销小,其结果是更有效和更高的数据库性能。这是一个MySQL一直都知道有这样的高性能的原因,匹配或行业标准基准跳动的专有的单片集成数据库。
从技术角度看,有什么样的独特的支持基础架构组件是存储引擎?一些关键的特征区别:
- 并发:应用更细粒度的锁的要求(如行级锁)比其他人。选择正确的锁定策略可以减少开销,从而提高整体性能。这个地区还包括功能,如多版本并发控制或支持“快照“阅读 
- 交易支持:不是每个应用程序都需要交易,但是能做到的,有非常明确的要求,如酸的合规性和更。 
- 参照完整性:需要有服务器通过DDL定义外键执行数据库的参照完整性。 
- 物理存储:这涉及到从表和索引的网页大小一切以及用于存储数据的物理磁盘格式。 
- 索引支持:不同的应用场景,往往从不同的索引策略效益。每个存储引擎一般都有自己的索引方法,虽然有些(如B树索引)是常见的几乎所有的引擎。 
- 高速缓存:不同的应用程序更好地应对一些内存缓存策略比其他人,所以虽然有些内存缓存的所有存储引擎常见(如用于用户连接),其他的唯一定义,只有当一个特定的存储引擎放在玩。 
- 履行辅助人这包括:多个I/O线程的并行操作,线程并发,数据库检查点,批量插入操作,和更多。 
- 各种目标特征这可能包括:地理空间操作的支持,对某些数据操作的安全性限制,以及其他类似的特征。 
设计一个特定的应用程序提供了一个选择性的好处是每集的可插拔的存储引擎基础设施组件。相反,避免一组组件的功能有助于减少不必要的开销。按理说,了解一个特定的应用程序的要求,选择合适的MySQL存储引擎可以对整个系统的效率和性能产生巨大影响。