16章选择存储引擎

目录

16.1设置的存储引擎
16.2 MyISAM存储引擎
16.2.1 MyISAM启动选项
16.2.2空间所需要的钥匙
16.2.3 Myisam table storagen格式
16.2.4 MyISAM表的问题
16.3内存存储引擎
16.4 CSV存储引擎
16.4.1检修CSV表
16.4.2 CSV的局限性
16.5 ARCHIVE存储引擎
16.6黑洞的存储引擎
16.7合并存储引擎
16.7.1合并表的优点和缺点
16.7.2合并表格的问题
16.8联邦存储引擎
16.8.1联邦存储引擎概述
16.8.2如何创建联合表
16.8.3联邦存储引擎的笔记与心得
16.8.4联邦存储引擎资源
16.9例存储引擎
16.10其他存储引擎
16.11概述MySQL存储引擎体系结构
16.11.1式存储引擎架构
16.11.2通用数据库服务器层

存储引擎是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表一CSV导出数据到电子表格和一些表MEMORY临时工作表

选择一个存储引擎

不同的存储引擎提供MySQL设计不同的用例在心。下表提供了一些存储引擎提供MySQL的概述,明确指出如下表。

表16.1存储引擎的特点总结

功能特色MyISAM内存InnoDB资料库NDB
树索引
在时间点的备份/恢复(注一)
群集数据库支持
聚簇索引
压缩数据是的(注2)
数据高速缓存N / A
数据加密传输(注3)
外键的支持是的(注4)
全文搜索索引是的(注5)
地理空间数据类型的支持
地理空间索引支持是的(注6)
哈希索引没有(注7)
索引缓存N / A
锁粒度
MVCC
复制支持(注一)Limited(注8)
存储限制256tbRAM64tb384eb
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。在本节稍后看到的讨论。

16.1设置的存储引擎

当你创建一个新表,你可以指定存储引擎的使用增加ENGINE表选项的CREATE TABLE声明:

-- ENGINE=INNODB not needed unless you have set a different-- default storage engine.CREATE TABLE t1 (i INT) ENGINE = INNODB;-- Simple table definitions can be switched from one to another.CREATE TABLE t2 (i INT) ENGINE = CSV;CREATE TABLE t3 (i INT) ENGINE = MEMORY;

当你忽略ENGINE选项,默认的存储引擎使用。默认的搜索引擎是InnoDB在MySQL 8。您可以指定默认的搜索引擎的使用--default-storage-engine服务器启动选项,或通过设置default-storage-engine选项中的my.cnf配置文件

你可以为当前会话设置默认存储引擎设置default_storage_engine变量:

SET default_storage_engine=NDBCLUSTER;

存储引擎TEMPORARY表的创建CREATE TEMPORARY TABLE可分别设置为永久表引擎设置default_tmp_storage_engine无论在启动或运行时

将表从一个到另一个存储引擎,使用ALTER TABLE声明,表明新引擎:

ALTER TABLE t ENGINE = InnoDB;

看到第13.1.18,“创建表的语法,和第13.1.8,“ALTER TABLE语法”

如果你想用一个存储引擎,编写不或是编译但停用,MySQL来创建一个表使用默认存储引擎。例如,在复制设置,也许你的主服务器使用InnoDB最安全的表,但从服务器使用其他存储引擎的耐久性或并发性消费速度。

默认情况下,将生成警告,每当CREATE TABLEALTER TABLE不能使用默认的存储引擎。为防止混乱,意外的行为如果所需的发动机是不可用的,使NO_ENGINE_SUBSTITUTIONSQL模式。如果所需的发动机是不可用的,这个设置会产生错误,而不是一个警告,而不是创建或修改表。看到第5.1.10,”服务器的SQL模式”

MySQL可以存储一个表的索引和数据在一个或多个其他文件,根据不同的存储引擎。表和列的定义存储在MySQL数据字典。个人存储引擎创建的任何额外所需的文件表,他们管理。如果一个表名包含特殊字符,为表文件名称包含编码版本的特征描述第9.2.3,“映射标识符文件名”

16.2 MyISAM存储引擎

MyISAM基于以上(不再可用)ISAM但有许多有用的扩展存储引擎。

表16.2 MyISAM存储引擎的特点

功能特色支持
树索引
在时间点的备份/恢复(实现在服务器中,而不是存储引擎。)
群集数据库支持
聚簇索引
压缩数据是的(压缩MyISAM表是仅当使用行压缩格式支持。使用行压缩格式的MyISAM表是只读的。)
数据高速缓存
数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。)
外键的支持
全文搜索索引
地理空间数据类型的支持
地理空间索引支持
哈希索引
索引缓存
锁粒度
MVCC
复制支持(实现在服务器中,而不是存储引擎。)
存储限制256tb
T树索引
交易
更新数据字典数据

每个MyISAM表存储在磁盘文件中的两。文件名开头的表名和要显示文件类型扩展名。数据文件有一个MVDMYData)扩展。索引文件的。我MYIndex)扩展。表定义存储在MySQL数据字典。

显式指定你想要的MyISAM表,表明一个引擎表选项:

CREATE TABLE t (i INT) ENGINE = MYISAM;

在MySQL 8中,通常需要使用ENGINE指定MyISAM因为存储引擎InnoDB是默认的搜索引擎

你可以检查或修理MyISAM表的mysqlcheck客户或myisamchk实用性。你也可以喜剧MyISAMMyISAMPack占用更少的空间。看到“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自动更新此列INSERTUPDATEOperations .This makes汽车_增量柱的速度(至少10%个)。在顶部的序列值不被删除后重新使用。(当AUTO_INCREMENT列定义为多列索引的最后一列的值删除,从一个序列上发生的重用。)汽车_增量价值可以重置ALTER TABLEmyisamchk

  • 动态大小的行不太分散混合时删除与更新和插入。这是通过自动将相邻删除块和延长块如果下一块被删除了。

  • MyISAM支持并发插入:如果一个表中的数据文件中没有空闲块,你可以INSERT进入新的行在同一时间,其他线程读取表。一个自由块可以作为一个结果,删除行或一个比现在的内容更多的数据长度动态行的更新发生。当所有的空闲块的使用(填写),同时又将成为未来。看到第8.11.3,并发插入”

  • 你可以把数据文件在不同的目录索引文件在不同的物理设备,以获得更高的速度DATA DIRECTORY索引目录表选项CREATE TABLE。看到第13.1.18,“创建表的语法

  • BLOBTEXT列可以被索引

  • NULL在索引列允许值。这需要0到1个字节的密钥。

  • 每个字符的列可以有不同的字符集。看到10章,字符集Unicode排序规则,

  • 有一个标志MyISAM索引文件是否被正确关闭表。如果mysqld开始的--myisam-recover-options选项,MyISAM表的自动检查和修复打开时,如果表中没有完全关闭。

  • myisamchk标记表,检查如果你运行它的--update-state选项myisamchk -快只检查那些表,没有这个标志。

  • myisamchk -分析存储统计部分的钥匙,以及整个键。

  • MyISAMPack可以包BLOBVARCHAR专栏

MyISAM还支持以下功能:

  • 对于一个真正的支持VARCHAR一种类型;VARCHAR柱从一个存储在一个或两个字节的长度。

  • VARCHAR列可能有固定的或动态的行长度。

  • 的长度的总和VARCHARCHAR表中的列可以高达64KB。

  • 任意长度UNIQUE约束

额外资源

16.2.1 MyISAM启动选项

下列选项mysqld可以用来改变行为MyISAM表。对于额外的信息,见第5.1.6、“服务器选项”

表16.3表选项和变量引用

姓名命令行选项文件系统无功状态变量变量范围动态
bulk_insert_buffer_size
concurrent_insert全球
重点写延迟全球
变量delay_key_write全球
have_rtree_keys全球
key_buffer_size全球
日志的
MyISAM块大小
_ MyISAM数据_指向_大小全球
myisam_max_sort_file_size全球
MyISAM _ mmap _ size全球
MyISAM -恢复选项
变量近义词
近义词全球
myisam_repair_threads
myisam_sort_buffer_size
_ _ MyISAM数据方法
_使用MyISAM _ mmap全球
跳过并行插入
变量concurrent_insert
tmp_table_size

下面的系统变量的影响的行为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。你应该有一个cron脚本,自动将这些文件从数据库目录的备份媒体。

16.2.2空间所需要的钥匙

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 TABLEALTER TABLE一张桌子,没有BLOBTEXT列,你可以强制表的格式固定的DYNAMICrow_format表选项

看到第13.1.18,“创建表的语法,有关ROW_FORMAT

你可以解压缩的压缩(解压)MyISAM表格的使用myisamchk--unpack它;4.6.4“,”myisamchk- MyISAM表维护工具”为更多的信息

16.2.3.1静态(固定长度)特性表

静态格式是默认的MyISAM表它是用来当表不包含可变长度列(VARCHARVARBINARYBLOB,或TEXT)。每一行都是使用一个固定数量的字节存储。

的三MyISAM存储格式,静态格式是最简单、最安全的(至少对贪污罪主体)。它也是最快的磁盘格式,由于容易,数据文件中的行可以在磁盘:查行根据索引中的行数,乘以行数的行长度计算的行位置。同时,扫描一个表时,它读取一个常数与每个磁盘读操作的行数很容易。

安全证明,如果你的电脑死机而MySQL服务器写入一个固定的格式MyISAM文件在这种情况下,myisamchk可以很容易地确定每一行的开始和结束,所以它通常可以回收除部分写一行。MyISAM表索引总是可以基于数据行重建。

笔记

固定长度的行格式只适用于表而不BLOBTEXT专栏创建一个表的列一个明确的row_format条款将不会引发错误或警告;格式规范将被忽略。

静态格式表有以下特点:

  • CHARVARCHAR列空间填充到指定的列的宽度,虽然列类型不改变。BINARYVARBINARY柱填充0x00字节列的宽度

  • NULL栏目需要额外的空间在连续记录是否值无效的。每个NULL需要一点额外的列,以最接近的字节。

  • 很快

  • 容易缓存

  • 易于重构之后崩溃,因为行位于固定位置。

  • 重组是必要的除非你大量的行删除,想返回空闲磁盘空间的操作系统。为此,使用OPTIMIZE TABLEmyisamchk - 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动态表因为国旗是存储在动态行标题。

16.2.3.2动态特性表

动态存储格式是用的MyISAM表包含任何可变长度列(VARCHARVARBINARYBLOB,或TEXT),或如果创建表的ROW_FORMAT=DYNAMIC表格选项

动态格式比静态格式更复杂一点,每一行都有一个标题,表明它有多长。一行可以变得支离破碎(存储在不连续的块)时它就不再作为一个更新。

你可以使用OPTIMIZE TABLEmyisamchk - R的整理表。如果你有固定长度列,你访问或表中还包含了一些可变长度列,经常发生变化,这可能是一个好主意,将可变长度列其他表只是为了避免碎片。

动态格式表有以下特点:

  • 所有字符串列的动态除长度小于四。

  • 每一行的前面有一个位图指示列包含空字符串(字符串列)或零(数值列)。这不包括列包含NULL价值观。如果一个字符串列的长度为零空格去除后,或者一个数字列的值为零,它标志着在位图而不是保存到磁盘。非空字符串保存为一个长度字节加字符串内容。

  • NULL栏目需要额外的空间在连续记录是否值无效的。每个NULL需要一点额外的列,以最接近的字节。

  • 较少的磁盘空间通常需要比固定长度的表。

  • 每行只使用是需要大的空间。然而,如果行变大,它分裂成许多碎片所造成的碎片,行。例如,如果你更新的信息,扩展行长度的行,列成碎片。在这种情况下,你可能要跑OPTIMIZE TABLEmyisamchk - 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 TABLEmyisamchk - R的

16.2.3.3压缩表的特点

压缩存储格式是一个只读格式,生成的MyISAMPack工具可压缩与压缩表myisamchk

压缩表具有以下特点:

  • 压缩表拿很少的磁盘空间。这最大限度地减少磁盘的使用,有助于在使用较慢的磁盘(如光盘)。

  • 每一行都是单独压缩,所以很少访问开销。一行标题占用一个三字节取决于最大的表中的行。每列压缩不同。通常为每列一个不同的Huffman tree。一些压缩类型:

    • 足够的空间压缩

    • 前缀空间压缩

    • 一个值为零的数字是基于一位存储。

    • 如果一个整数列的值有一个小的范围内,柱是用最小的可能类型的存储。例如,一个BIGINT柱(八字节)可以存储为一个TINYINT列(一个字节)如果它的值的范围是从-128127

    • 如果一列只有一小套可能的数值数据类型转换为ENUM

    • 一列可以使用前面的压缩类型的任何组合。

  • 可用于固定长度或动态长度行。

笔记

而压缩表是只读的,因此你不能更新或添加在表的行,DDL(数据定义语言)操作仍然有效。例如,你仍然可以使用DROP删除表,并TRUNCATE TABLE到空的桌子

16.2.4 MyISAM表的问题

MySQL用于存储数据的文件格式已被广泛的测试,但总有可能导致数据库损坏的情况下。下面的讨论描述了这如何发生,如何处理它。

16.2.4.1损坏的MyISAM表

尽管MyISAM表格式是很可靠的(一个由SQL语句,使表中的所有变化都写在语句返回),你仍然可以得到损坏的表如果下列任何事件发生:

  • 这个mysqld方法是在写中死亡

  • 发生意外关机(例如,计算机是关闭的)。

  • 硬件故障

  • 你正在使用一个外部程序(如myisamchk)修改了一个表,同时由服务器修改。

  • 一个软件缺陷在MySQL或MyISAM代码

一个腐败的表的典型症状:

  • 从表中选择数据而得到你下面的错误:

    Incorrect key file for table: '...'. Try to repair it
    
  • 查询不到表中的行或返回不完全的结果。

你可以检查一个健康MyISAM表格的使用CHECK TABLE声明,并修复已损坏的MyISAMREPAIR TABLE。什么时候mysqld没有运行,你也可以检查或修理的表myisamchk命令。看到第13.7.3.2,“检查表语法”第13.7.3.5,修表的语法”,和4.6.4“,”myisamchk- MyISAM表维护工具”

如果你的表会损坏频繁,你应该试着去了解为什么会发生这样的事情。最重要的事情是知道表是否成为损坏由于服务器崩溃。你可以验证这个容易通过寻找最近的restarted mysqld在错误日志中的信息。如果有这样的消息,很可能是由于表腐败服务器死。否则,可能在正常操作过程中发生腐败。这是一个错误。你应该尝试创建一个可重复的测试案例说明的问题。看到第b.5.3.3,“做什么如果MySQL总是死机”,和28.5节,“调试和移植MySQL”

16.2.4.2问题表格不正确关闭

每个MyISAM索引文件(。我文件)在标头,可以用来检查表是否已正确关闭计数器。如果你有以下警告CHECK TABLEmyisamchk,这意味着这个柜台已经不同步:

clients are using or haven't closed the table properly

该警告并不一定意味着表已损坏,但你至少应该检查表。

计数器的工作原理如下:

  • 第一次表更新MySQL,在索引文件中的头一个计数器。

  • 计数器是不是在进一步的更新变化。

  • 当一个表的最后一个实例是封闭的(因为FLUSH TABLES手术或因为在表缓存中没有房间),计数器递减如果表一直在任何时候更新。

  • 当你修表或检查表,发现它是好的,计数器将重置为零。

  • 避免与其他进程可能检查表交互问题,反不减关闭如果是零。

换句话说,反能成为错误只有在这些条件下:

16.3内存存储引擎

这个MEMORY存储引擎(原名)创建,存储在存储器中的内容专用表。因为数据是容易死机,硬件问题,或停电,只使用这些表的临时工作区或只读缓存数据从其他表拉。

表16.4内存存储引擎的特点

功能特色支持
树索引
在时间点的备份/恢复(实现在服务器中,而不是存储引擎。)
群集数据库支持
聚簇索引
压缩数据
数据高速缓存N / A
数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。)
外键的支持
全文搜索索引
地理空间数据类型的支持
地理空间索引支持
哈希索引
索引缓存N / A
锁粒度
MVCC
复制支持(实现在服务器中,而不是存储引擎。)有限公司(本节。后来看讨论)
存储限制RAM
T树索引
交易
更新数据字典数据

当使用内存或NDB集群

开发商希望部署应用程序使用MEMORY存储引擎的重要,高可用性,或经常更新的数据应该考虑是否NDB集群是一个更好的选择。一个典型的使用情况内存引擎涉及这些特点:

  • 业务涉及瞬态、非关键数据,如会话管理和缓存。当MySQL服务器停止或重新启动时,数据MEMORY表丢了

  • 在内存中存储的快速访问和低延迟。数据量可以完全在内存中而不引起操作系统的虚拟内存页交换出去。

  • 一个只读或读的大多数据访问模式(有限更新)。

NDB集群提供了相同的功能的MEMORY具有较高的性能水平的发动机,并提供额外的功能不可用内存

  • 行级锁定和客户之间的低竞争多线程操作。

  • 可扩展性甚至语句混合,包括写。

  • 可选的磁盘支持的操作数据的耐久性。

  • 无共享架构和多主机操作,无单点故障,使99.999%的可用性。

  • 自动数据分布在各个节点;应用开发者不必手工定制分区或分区方案。

  • 可变长度数据类型的支持(包括BLOBTEXT)不支持内存

分区

MEMORY表不能被分区

性能特点

MEMORY性能约束的竞争从单线程执行和表锁时的开销处理更新。这限制了可扩展性,当负荷增加,特别是对语句的混合,包括写。

尽管在内存中处理MEMORY表,他们并不比一定更快InnoDB在一个繁忙的服务器表、通用查询,或在一个读/写的工作量。特别是,表锁定参与执行更新可以减缓并行使用内存从会话表的多

根据对查询的种类MEMORY表,你可以创建指标为默认哈希数据结构(查找基于独特的关键单值),或一个通用的B树的数据结构(各种涉及平等,不平等,或范围的运营商如小于或大于)查询。以下各节说明创建指标两种语法。一种常见的性能问题是负载在B-树索引是更有效的使用默认哈希索引。

内存表的特点

这个MEMORY存储引擎不创建磁盘上的任何文件。表定义存储在MySQL数据字典。

MEMORY表具有以下特点:

  • 空间MEMORY表中分配块。表100为使用动态散列插入。没有溢出区或额外需要的密钥空间。自由列表不需要额外的空间。放在一个链表中删除行和重复使用,当你插入到新的数据表。内存表格也有常用的删除和插入哈希表的相关问题没有。

  • MEMORY表使用一个固定长度的行存储格式。可变长度的类型,如VARCHAR使用一个固定长度的存储。

  • MEMORY表中不能包含BLOBTEXT专栏

  • MEMORY包括支持汽车_增量专栏

  • 非—TEMPORARY内存表中所有客户共享,就像任何其他非—TEMPORARY

DDL操作记忆表

创建一个MEMORY表,指定条款ENGINE=MEMORYCREATE 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 TABLETRUNCATE 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表在MySQL服务器启动时,您可以使用--init-file选项例如,你可以把这样的语句INSERT INTO ... SELECTLOAD DATA INFILE这个文件从一个持久数据源负载表。看到第5.1.6、“服务器选项”,和第13.2.7、“LOAD DATA INFILE语法”

内存表和复制

服务器的MEMORY表成空时,关闭并重新启动。如果服务器的复制,它的奴隶并没有意识到这些表都成空,所以你看过时的内容如果你选择从奴隶的表中的数据。同步主从内存表,当MEMORY桌子是用一个启动以来第一次的主人,一个DELETE声明是写给师父的二进制日志,空桌上的奴隶也。奴隶仍然在表上有过时的数据在主人之间的间隔启动和首次使用的表。为了避免这一区间时,奴隶直接查询可以返回过期数据,使用--init-file选择填充内存在启动主表

管理内存使用

服务器需要足够的内存来保存所有MEMORY表,在使用的同时

记忆不是再生如果你删除单个行的MEMORY表只有当内存回收整个表格被删除。记忆,是以前用于删除的行被重新用于新的行相同的表内。释放所有内存使用的内存表当你不再需要它的内容,执行DELETETRUNCATE 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至少为高价值,希望每个内存表格能够成长

额外资源

论坛致力于MEMORY存储引擎可以在forums.mysql.com http:/ / / list.php?92

16.4 CSV存储引擎

这个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的计算。

16.4.1检修CSV表

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文件的第一行到损坏的行复制到新表。从第一个损坏排到端上餐桌的所有其他行被删除,即使是合法的行。

16.4.2 CSV的局限性

这个CSV存储引擎不支持索引

这个CSV存储引擎不支持分区

您创建的所有表的使用CSV存储引擎必须有不为空在所有的列属性。然而,为了向后兼容,可以继续使用表可为空的列,在以前的MySQL版本创建。(错误# 32050)

16.5 ARCHIVE存储引擎

这个ARCHIVE存储引擎生产专用表,存储大量的在一个非常小的空间索引的数据。

表16.5档案存储引擎的特点

功能特色支持
树索引
在时间点的备份/恢复(实现在服务器中,而不是存储引擎。)
群集数据库支持
聚簇索引
压缩数据
数据高速缓存
数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。)
外键的支持
全文搜索索引
地理空间数据类型的支持
地理空间索引支持
哈希索引
索引缓存
锁粒度
MVCC
复制支持(实现在服务器中,而不是存储引擎。)
存储限制
T树索引
交易
更新数据字典数据

这个ARCHIVE存储引擎包含在MySQL的二进制分布。启用该存储引擎如果你建立MySQL源码,调用CMake-DWITH_ARCHIVE_STORAGE_ENGINE选项

检查源的ARCHIVE发动机,看在存储/资料库一个MySQL源分布目录。

你可以检查是否ARCHIVE存储引擎是可用的SHOW ENGINES声明

当你创建一个ARCHIVE表的存储引擎创建的名称和表名称开始文件。数据文件的扩展名的。一个.ARN文件可能在优化操作中出现。

这个ARCHIVE引擎支持INSERTREPLACE,和SELECT,但不DELETEUPDATE。它支持顺序操作,BLOB列,基本上所有的空间数据类型(见第11.5.1,“数据类型”)。这个ARCHIVE引擎使用行级锁

这个ARCHIVE引擎支持汽车_增量column属性。theAUTO_INCREMENT列可以有一个独特的或非唯一索引。试图创建一个在一个错误的任何其他列结果指标。这个资料库引擎还支持AUTO_INCREMENT表选项CREATE TABLE语句来指定新表的初始序列的价值或重置现有表的序列值,分别。

ARCHIVE不支持插入一个值为汽车_增量柱柱最大值小于当前。这样的做法导致ER_DUP_KEY误差

这个ARCHIVE引擎忽略BLOB如果他们不要求列扫描过去他们在阅读。

这个ARCHIVE存储引擎不支持分区

存储行压缩为他们插。这个ARCHIVE发动机采用zlib无损数据压缩(见www.zlib.net http:/ / /)。你可以使用OPTIMIZE TABLE分析表和包装成一个较小的格式(一个理由使用OPTIMIZE TABLE,在本节稍后看到)。该机还支持CHECK TABLE。有几种类型的插入,用:

  • 一个INSERT声明只是推行压缩成一个缓冲区,缓冲区刷新,必要时。插入缓冲区是由锁保护。一SELECT冲洗发生力量

  • 大容量插入可见后才完成的,除非其他插入发生在同一时间,在这种情况下,可以看到部分。一SELECT不会引起一阵大容量插入除非虽然加载发生正常的插入。

检索:在检索,行压缩需求;没有行缓存。一SELECT操作执行一个完整的表扫描:当SELECT时,发现了多少行是目前可用的和读取的行数。SELECT作为一个一致的阅读进行。值得注意的是,很多SELECT报表中插入可以使压缩,除非是只用于批量插入。为了达到更好的压缩,可以使用OPTIMIZE TABLEREPAIR TABLE。中的行数资料库表报告SHOW TABLE STATUS总是准确的。看到第13.7.3.4,“优化表语法”第13.7.3.5,修表的语法”,和第13.7.6.36,“显示表状态语法”

额外资源

16.6黑洞的存储引擎

这个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,描述如下:

图16.1复制使用黑洞过滤

Replication using BLACKHOLE for filtering

大师写的二进制日志。这个笨蛋mysqld过程作为一个奴隶,应用所需的组合replicate-do-*复制- ignore *规则,并写了一个新的,过滤自己的二进制日志。(见第17.1.6,“复制和二进制日志记录选项和变量”。)这过滤日志提供给奴隶。

虚拟过程实际上并不存储任何数据,因此很少有处理开销,通过运行额外的费用mysqld在复制主机进程。这种设置可以重复的额外复制的奴隶。

INSERT触发器黑洞表象预期的那样工作。然而,由于BLACKHOLE表实际上并不存储任何数据,UPDATEDELETE触发器不激活的每一行在触发器定义条款不适用,因为没有行。

对于其他可能的用途BLACKHOLE存储引擎包括:

  • 转储文件的语法验证

  • 从二进制日志的开销测量,通过比较性能使用BLACKHOLE有和无的二进制日志功能。

  • BLACKHOLE基本上是一个NO在存储引擎,可用于发现性能瓶颈的存储引擎本身没有关系。

这个BLACKHOLE发动机是交易的意识,在某种意义上说,已提交的事务写入二进制日志、回滚事务不。

黑洞引擎和自动递增列

黑洞引擎是一个没有运算引擎。任何操作使用黑洞在桌子上就没有效果。这应该牢记在考虑主键列,自动增量的行为。发动机不会自动递增字段的值,而不保留自动递增字段状态。这在复制中具有重要的意义。

考虑下面的复制场景,以下所有三个条件适用:

  1. 在主服务器上有一个自动递增字段是主键的黑洞表。

  2. 在从同一个表存在但使用MyISAM引擎。

  3. 插入行到主人的桌子没有显式设置在自动增量值INSERT语句本身或通过使用一个集insert_id声明

在这种情况下,复制将失败,在主键列上重复录入错误。

在基于语句的复制,价值INSERT_ID在上下文事件永远是相同的。复制将因此由于试图插入一行一个主键列值重复失败。

在基于行的复制,使引擎返回的行始终是相同的每个插入值。这将导致在奴隶试图重放两插入日志条目使用相同的值的主键列,所以复制将失败。

柱过滤

使用基于行的复制时,(binlog_format=ROW),一个奴隶在最后一列的缺失表支持,在部分的描述第17.4.1.9,“复制不同的表定义在大师和Slave”

这种过滤对奴隶的一面,即列复制到奴隶才被过滤掉。至少有两种情况下,这是不可取的复制列的奴隶:

  1. 如果数据是保密的,所以从服务器不应该访问它。

  2. 如果主人有许多奴隶,过滤之前发送到奴隶可以减少网络流量。

主柱过滤可以实现用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;

16.7合并存储引擎

这个MERGE存储引擎,也被称为MRG _ MyISAM发动机,是一个集相同MyISAM表格可以作为一个相同意味着所有的表具有相同的列的数据类型和索引信息。无法合并MyISAM表中的列以不同的顺序列出,不在相应的列具有相同的数据类型,或以不同的顺序有指标。然而,任何或所有的MyISAM表格可以压缩MyISAMPack。看到4.6.6“,”MyISAMPack生成的压缩,只读MyISAM表”。表之间的差异等这些并不重要:

  • 相应的列和索引的名称可以不同。

  • 意见表、列和索引可以不同。

  • 表选项如AVG_ROW_LENGTHmax_rows,或PACK_KEYS可以不同

另一种方法MERGE表分区表,它存储在单独的文件中的一个表分区,使一些操作能更有效地执行。有关更多信息,参见22章,分区

当你创建一个MERGE创建一个表,MySQLMRG在磁盘上包含的基本名称的文件MyISAM表应作为一。本表格式合并表存储在MySQL数据字典。基础表不一定要在同一数据库为MERGE

你可以使用SELECTDELETEUPDATE,和INSERT打开(放)合并表你必须有SELECTDELETE,和UPDATE上的特权MyISAM在你的地图上MERGE

笔记

使用MERGE表包含以下安全问题:如果一个用户访问MyISAMt,用户可以创建一个合并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表,您可以使用下列方法之一:

  • DROP这个合并表并重新创建它

  • 使用ALTER TABLE tbl_name UNION=(...)改变基本表列表

    也可以使用ALTER TABLE ... UNION=()(那是一个空UNION条款)除去所有基础表。然而,在这种情况下,表是有效空和插入失败就是因为没有基础表采取新的行。这样一个表可以用作创建新模板合并CREATE TABLE ... LIKE

基本表的定义和指标必须符合密切的定义MERGE表一致性检查的一部分,是一个当桌子合并表打开,并不时MERGE表的创建。如果任何表的一致性检查失败,引发表的打开操作失败。这意味着在一个表的定义的变化合并可能导致失败的时MERGE表的访问。一致性检查每个表的应用:

  • 基础表和MERGE表必须有相同的列数

  • 基础表中的列顺序和MERGE表格必须匹配

  • 此外,在母各相应列的规范MERGE表和基础表进行比较,必须满足这些支票:

    • 基础表中的列的类型和MERGE表格必须相等

    • 基础表中的列的长度和MERGE表格必须相等

    • 下面的表的列和MERGE表格可以无效的

  • 基础表必须至少有许多指标作为MERGE表基础表中可能有更多的指标比合并表,但不能少

    笔记

    一个已知的问题存在,在同一列的索引必须是相同的顺序,在两MERGE表、底层MyISAMtable。这# 33653 bug。

    各项指标必须满足这些支票:

    • 对基础表的索引类型和MERGEmust be the same table。

    • 指数部分的数目(即多个列在一个复合索引)索引定义中的基本表和MERGE表格必须相同

    • 对每个指标的部分:

      • 指数部分的长度必须相等。

      • 指数部分的类型必须相同。

      • 指数部分的语言必须是平等的。

      • 检查是否可以指数部件NULL

如果一个MERGE表无法打开或使用因为与基础表的问题,CHECK TABLE显示有关信息表引起的问题。

额外资源

16.7.1合并表的优点和缺点

MERGE表格可以帮助您解决以下问题:

  • 轻松管理一组日志表。例如,你可以把数据从不同的月成单独的表,压缩一些人MyISAMPack,然后创建一个MERGE表作为一个

  • 获得更高的速度。你可以把一些标准为基础的大型只读的表,然后把各个表在不同的磁盘上。一MERGE表格这种方式可能比使用一个单一的大表快得多。

  • 执行更有效的搜索。如果你知道你正在寻找什么,你可以只是其中的一些查询基本表的搜索和使用MERGE表的人。你甚至可以有许多不同的合并表使用重叠套表

  • 执行更高效的维修。这是更容易修复个体较小的表映射到MERGE表比修复一个大桌子

  • instantly地图多表有一个。AMERGE表格不需要维护自己的指标,因为它使用的单个表的索引。因此,合并表集合非常快速创建或重新映射。(你还必须指定索引的定义,当你创建一个MERGE表,即使没有创建索引。)

  • 如果你有一套表由你创造需求,一个大桌子,你可以创建一个MERGE表从他们的需求。这是速度更快,节省了大量的磁盘空间。

  • 超过操作系统的文件大小限制。每个MyISAM表是由这个限制的约束,但收集的MyISAM表不

  • 你可以一个一个别名或同义词的创建MyISAM通过定义一个表合并表映射到单个表。不应该有很显著的性能影响做这(只有一对夫妇的间接调用memcpy()每读电话)

的缺点MERGE表:

  • 你可以使用相同的MyISAM为表合并

  • 一些MyISAM功能无效合并表例如,您不能创建FULLTEXT指标合并表(你可以创建FULLTEXT对基础指标MyISAM表,但你不能搜索MERGE与全文检索表。)

  • 如果MERGE表是永久,所有的底层MyISAM表格必须是非定时的。如果MERGE桌子是暂时的MyISAM表格可以任意组合的临时和永久。

  • MERGE表格中使用多个文件描述符比MyISAM表。如果在10 clients are usingMERGE表映射到10台,服务器使用(10×文件描述符10)10。(10数据文件描述符的10个客户,和10的索引文件描述符之间共享的客户。)

  • 索引读取速度较慢。当你读到一个指数的MERGE存储引擎需要问题的所有基本表读取检查哪一个最符合一个给定的索引值。读下一个索引值,该合并存储引擎需要搜索读取缓冲区中寻找下一个值。只有当一个索引缓冲区是用来存储引擎需要读取下一个索引块。这使得MERGE指标要慢得多eq_ref搜索,但不太慢ref搜索为更多的信息关于eq_refref,看到第13.8.2,”解释语法”

16.7.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没有象预期的那样工作。两个关键事实:

    • REPLACE可以检测出独特的重点违法行为只有在基本表,它是要写(这是由insert_method选项)。这differs violations虔诚的MERGE表本身

    • 如果REPLACE检测到一个独特的关键行为,它将在基础表中是写只有相应的行变化;即第一个或最后一个表,确定的insert_method选项

    类似的考虑也适用于INSERT ... ON DUPLICATE KEY UPDATE

  • MERGE不支持分区表。那就是,你不能分割合并表,也没有任何一个MERGE表的基础MyISAMpartitioned表好。

  • 你不应该使用ANALYZE TABLEREPAIR TABLEOPTIMIZE TABLEALTER TABLEDROP TABLEDELETE没有一个哪里条款,或TRUNCATE TABLE对那些被映射到一个打开的表合并表如果你这样做的MERGE表可能仍然是指原始表和产生意外的结果。要解决此问题,确保没有合并表保持开放,通过发行FLUSH TABLES执行任何指定的操作事先声明。

    意想不到的结果,包括在操作的可能性MERGE表格将报告表损坏。如果这发生在一个名叫操作的基础MyISAM表格、腐败的信息是虚假的。为了解决这一问题,问题FLUSH TABLES修改后的声明MyISAM

  • DROP TABLE在表格中使用的合并表不工作在Windows因为MERGE存储引擎的表映射隐藏从MySQL上层。Windows不允许打开的文件被删除,所以你必须先冲洗所有合并FLUSH TABLES)或降合并在删除表表

  • 的定义MyISAM表和合并表检查表被访问时(例如,作为一个SELECTINSERT声明)。检查确保表和母公司的定义合并表定义的列顺序匹配比较,类型,大小和相关指标。如果表之间有差异,则返回一个错误的语句失败。因为这些检查发生在表打开,对一个表中定义的任何变化,包括列变化,列排序,和发动机的改变将导致语句失败。

  • 在索引的顺序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)

16.8联邦存储引擎

这个FEDERATED存储引擎可以访问从远程MySQL数据库的数据复制或不使用集群技术。查询本地联邦表格自动将数据从远程(联邦)表。没有数据存储在本地表。

包括FEDERATED如果你建立MySQL存储引擎源码,调用CMake-DWITH_FEDERATED_STORAGE_ENGINE选项

这个FEDERATED通过在运行的服务器的默认没有启用存储引擎;使联邦,你必须启动MySQL服务器的二进制使用--federated选项

检查源的FEDERATED发动机,看在存储/联合一个MySQL源分布目录。

16.8.1联邦存储引擎概述

当你创建一个表,使用一个标准的存储引擎(如MyISAMCSVInnoDB),表由表定义和相关的数据。当你创建一个联邦表,表的定义是相同的,但是数据的物理存储在远程服务器上处理。

FEDERATED表由两元素:

  • 远程服务器一个数据库表,从而为表定义(存储在MySQL数据字典)和相关的表。远程表的表类型可以通过远程支持任何类型mysqld服务器,包括MyISAMInnoDB

  • 本地服务器一个数据库表,在表的定义相匹配的对应表在远程服务器。表定义存储在数据字典。没有数据文件在本地服务器。相反,表定义包括一个连接字符串指向远程表。

当执行查询和报表上FEDERATED在本地服务器上的操作,通常会插入、更新或删除信息从本地数据文件而不是发送到执行远程服务器,在那里他们更新远程服务器上或从远程服务器匹配行的数据文件。

一个基本的结构FEDERATED表格设置显示图16.2,“密表结构”

图16.2联合表结构

Content is described in the surrounding text.

当客户端发出的SQL语句,指的是一个FEDERATED表,地方的信息服务器之间的流量(在SQL语句执行)和远程服务器(如数据存储)如下:

  1. 存储引擎看起来通过每一列的FEDERATED表构建一个适当的SQL语句是指远程表。

  2. 声明是使用MySQL客户端API发送到远程服务器。

  3. 远程服务器处理报表和本地服务器检索任何结果,语句产生(受影响的行数或结果集)。

  4. 如果语句产生一个结果集,每列转换为内部格式,存储引擎FEDERATED发动机预计可用于显示结果,发出原始语句的客户端。

本地服务器使用MySQL客户端C API函数的远程服务器进行通信。它调用mysql_real_query()发声明。读一个结果集,它使用mysql_store_result()取行一次使用mysql_fetch_row()

16.8.2如何创建联合表

创建一个FEDERATED表你应该遵循这些步骤:

  1. 创建远程服务器上的表。或者,让一个现有的表的表定义的一个注,也许使用SHOW CREATE TABLE声明

  2. 创建具有相同的表定义本地服务器上的表,但是添加链接本地表的远程表的连接信息。

例如,您可以创建远程服务器上的表:

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通过添加索引的表的主表。优化会因为发送到远程服务器的查询将包括的内容哪里条款将被发送到远程服务器,然后本地执行。这减少了网络流量,否则局部处理服务器请求的整个表。

16.8.2.1创造一个联合使用的连接表

使用第一种方法,您必须指定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:用于连接的用户名称。该用户必须已经在远程服务器上创建的,必须有合适的权限来执行所需的行动(SELECTINSERTUPDATE这是一个很好的东西

  • 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'

16.8.2.2创造一个联合表使用创建服务器

如果你正在创建一个数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
描述CONNECTION字符串CREATE SERVER选项mysql.servers专栏
连接方案schemewrapper_nameWrapper
远程用户user_nameUSERUsername
远程密码passwordPASSWORDPassword
远程主机host_nameHOSTHost
远程端口port_numPORTPort
远程数据库db_nameDATABASEDb

16.8.3联邦存储引擎的笔记与心得

你应该注意以下几点在使用FEDERATED存储引擎:

  • FEDERATED表格可以复制到其他的奴隶,但你必须确保从服务器可以使用用户名/密码组合,定义在联系字符串(或在列mysql.servers表)连接到远程服务器。

以下显示的特点,FEDERATED存储引擎不支持:

  • 远程服务器必须是一个MySQL服务器。

  • 一个远程表FEDERATED表点必须你试图通过访问表之前就存在FEDERATED

  • 一是可能的FEDERATED表点到另一个,但你必须小心不要创建一个循环。

  • FEDERATED表不支持指标在通常意义上的;因为访问表数据的远程处理,它实际上是远程表,利用指标。这意味着,对于一个查询,不能使用任何指标,因此需要全表扫描,服务器从远程表和过滤器局部取所有行。这无论发生任何哪里LIMIT用这个SELECT声明;这些条款是局部使用返回的行。

    查询不使用索引可以导致业绩不佳和网络过载。此外,由于返回的行必须存储在内存中,这样的查询也能导致本地服务器交换,甚至挂。

  • 应注意,当创建一个FEDERATED从等效指标定义表MyISAM或其他表可能不支持。例如,创建一个FEDERATED表的索引前缀VARCHARTEXTBLOB列会失败。下面的定义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';

    如果可能的话,你应该尝试不同的列和索引定义创建对远程服务器和避免这些指标问题的本地服务器上桌时。

  • 在内部,实现使用SELECTINSERTUPDATE,和DELETE,但不HANDLER

  • 这个FEDERATED存储引擎支持SELECTINSERTUPDATEDELETETRUNCATE TABLE,和指标。它不支持ALTER TABLE,或任何数据定义语言,直接影响表的结构,除了DROP TABLE。当前实现不使用预处理语句。

  • FEDERATED接受INSERT ... ON DUPLICATE KEY UPDATE报表,但如果发生复制钥匙的侵害,该语句将失败与错误。

  • 不支持交易

  • FEDERATED执行大容量插入处理等多个行发送到远程表在一个批处理,从而提高性能。另外,如果远程表是事务性的,它使远程存储引擎执行语句回滚应该出现错误。这种能力具有以下的局限性:

    • 插入的大小不能超过最大的服务器之间的数据包的大小。如果将超过这个尺寸,它分为多个包和回滚可能发生问题。

    • 大容量插入处理不发生INSERT ... ON DUPLICATE KEY UPDATE

  • 是没有办法的FEDERATED引擎知道远程表已经改变。原因是这台必须像一个数据文件,将不会被任何东西比其他数据库系统来写。在当地表数据的完整性被破坏如果有远程数据库的任何变化。

  • 当使用CONNECTION字符串,你不能在密码中使用的字符'@'。你可以绕过这个限制使用CREATE SERVER语句创建一个服务器连接。

  • 这个insert_idtimestamp选项不传播到数据提供商。

  • 任何DROP TABLE发表反对声明联邦表滴只有本地表,没有远程表。

  • FEDERATED表格不查询缓存的工作。

  • 用户定义的分区不支持FEDERATED

16.8.4联邦存储引擎资源

下列额外的资源是可用的FEDERATED存储引擎:

16.9例存储引擎

这个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存储引擎不支持分区

16.10其他存储引擎

其他存储引擎可以提供来自第三方的社区成员,使用自定义的存储引擎接口。

第三方引擎不支持MySQL。为进一步的信息、文档、安装指南、错误报告或任何帮助或协助这些引擎,请直接联系发动机的开发。

在开发一个客户的存储引擎,可以使用可插拔的存储引擎架构的更多信息,参见MySQL内核:编写一个自定义的存储引擎

16.11概述MySQL存储引擎体系结构

MySQL插件式存储引擎的架构使数据库的专业选择为特定的应用需要专门的存储引擎而被完全屏蔽的需要任何特定的应用程序要求编码管理。MySQL服务器体系结构将应用程序员和DBA从所有的底层实现细节在存储层,提供一致的和简单的应用模型和API。因此,虽然有不同的存储引擎不同的能力,应用屏蔽这些差异。

可插拔的存储引擎体系结构提供了一套标准的管理,是常见的所有底层存储引擎中支持服务。存储引擎本身是组件的数据库服务器,实际执行操作的基础数据保持在物理服务器级别。

这种高效的、模块化的架构提供了那些专门针对特定的应用需要,如数据仓库、事务处理的巨大利益,或高可用性的情况下同时享受使用一组接口和服务,是独立于任何一个存储引擎的优势。

应用程序员和DBA的MySQL数据库交互通过连接器API和服务层,上面的存储引擎。如果应用程序的变化带来的要求,要求底层存储引擎,或一个或多个存储引擎被加入来支持新的需求,没有明显的编码或过程变化的需要做的工作。MySQL服务器体系结构屏蔽应用的存储引擎的底层复杂性呈现一致的和易于使用的API,适用于存储引擎。

16.11.1式存储引擎架构

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声明:

卸载插件的例子;

如果你拔掉存储引擎,是由现有的表,这些表变得不可访问,但仍将在磁盘上存在(如适用)。确保没有表使用的存储引擎在你拔出存储引擎。

16.11.2通用数据库服务器层

MySQL插件式存储引擎是MySQL数据库服务器,负责执行实际的数据I/O操作的数据库以及启用和执行一定的功能集,针对特定应用需要的组件。使用特定的存储引擎的主要好处是,你只交付一个特定的应用程序所需的功能,因此你在数据库系统开销小,其结果是更有效和更高的数据库性能。这是一个MySQL一直都知道有这样的高性能的原因,匹配或行业标准基准跳动的专有的单片集成数据库。

从技术角度看,有什么样的独特的支持基础架构组件是存储引擎?一些关键的特征区别:

  • 并发:应用更细粒度的锁的要求(如行级锁)比其他人。选择正确的锁定策略可以减少开销,从而提高整体性能。这个地区还包括功能,如多版本并发控制或支持快照阅读

  • 交易支持:不是每个应用程序都需要交易,但是能做到的,有非常明确的要求,如酸的合规性和更。

  • 参照完整性:需要有服务器通过DDL定义外键执行数据库的参照完整性。

  • 物理存储:这涉及到从表和索引的网页大小一切以及用于存储数据的物理磁盘格式。

  • 索引支持:不同的应用场景,往往从不同的索引策略效益。每个存储引擎一般都有自己的索引方法,虽然有些(如B树索引)是常见的几乎所有的引擎。

  • 高速缓存:不同的应用程序更好地应对一些内存缓存策略比其他人,所以虽然有些内存缓存的所有存储引擎常见(如用于用户连接),其他的唯一定义,只有当一个特定的存储引擎放在玩。

  • 履行辅助人这包括:多个I/O线程的并行操作,线程并发,数据库检查点,批量插入操作,和更多。

  • 各种目标特征这可能包括:地理空间操作的支持,对某些数据操作的安全性限制,以及其他类似的特征。

设计一个特定的应用程序提供了一个选择性的好处是每集的可插拔的存储引擎基础设施组件。相反,避免一组组件的功能有助于减少不必要的开销。按理说,了解一个特定的应用程序的要求,选择合适的MySQL存储引擎可以对整个系统的效率和性能产生巨大影响。