15章:存储引擎和表类型

目录

15.1. MyISAM存储引擎

15.1.1. MyISAM启动选项

15.1.2.键所需的空间

15.1.3. MyISAM表的存储格式

15.1.4. MyISAM表的问题

15.2. InnoDB存储引擎

15.2.1. InnoDB概述

15.2.2. InnoDB联系信息

15.2.3. InnoDB配置

15.2.4. InnoDB启动选项

15.2.5. 创建InnoDB表空间

15.2.6. 创建InnoDB表

15.2.7. 添加和删除InnoDB数据和日志文件

15.2.8. InnoDB数据库的备份和恢复

15.2.9. InnoDB数据库移到另一台机器

15.2.10. InnoDB事务模型和锁定

15.2.11. InnoDB性能调节提示

15.2.12. 多版本的实施

15.2.13. 表和索引结构

15.2.14.文件空间管理和磁盘I/O

15.2.15. InnoDB错误处理

15.2.16. InnoDB表的限制

15.2.17. InnoDB故障诊断和排除

15.3. MERGE存储引擎

15.3.1. MERGE表 方面的问题

15.4. MEMORY(HEAP)存储引擎

15.5. BDB(BerkeleyDB)存储引擎

15.5.1. BDB支持的操作系统

15.5.2. 安装BDB

15.5.3. BDB启动选项

15.5.4. BDB表的特性

15.5.5. 修改BDB所需的事宜

15.5.6. BDB表的限制

15.5.7. 使用BDB表时可能 出现的错误

15.6. EXAMPLE存储引擎

15.7. FEDERATED存储引擎

15.7.1. 安装FEDERATED存储引擎

15.7.2. FEDERATED存储引擎的介绍

15.7.3. 如何使用FEDERATED表

15.7.4. FEDERATED存储引擎的局限

15.8. ARCHIVE存储引擎

15.9. CSV存储引擎

15.10.BLACKHOLE存储引擎

MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:

·         MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。

·         MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被 默认包含在MySQL中。

注释:MEMORY存储引擎正式地被确定为HEAP引擎。

·         InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也 默认被包括在所有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。

·         EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务 ,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者

·         NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。

·         ARCHIVE存储引擎被用来无索引地,非常小覆盖存储的大量数据。

·         CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。

·         BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。

·         FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。

寻求选择一个存储引擎的帮助,请参阅14.4节,“选择一个存储引擎”

这一章讲述除NDB Cluster外的每一个MySQL存储引擎,NDB Cluster在第17章:MySQL Cluster中介绍。

当年创建一个新表的时候,你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表:

CREATE TABLE t (i INT) ENGINE = INNODB;
      
      
       
CREATE TABLE t (i INT) TYPE = MEMORY;
      
      
       

虽然TYPE仍然在MySQL 5.1中被支持,现在ENGINE是首选的术语。

如果你省略掉ENGINE或TYPE选项,默认的存储引擎被使用。一般的默认是MyISAM,但你可以用--default-storage-engine或--default-table-type服务器启动选项来改变它,或者通过设置storage_engine或table_type系统变量来改变。

当MySQL被用MySQL配置向导安装在Windows平台上,InnoDB存储引擎替代MyISAM存储引擎作为替代,请参阅2.3.5.1节,“介绍”

要把一个表从一个类型转到另一个类型,可使用ALTER TABLE语句,这个语句指明新的类型:

ALTER TABLE t ENGINE = MYISAM;
      
      
       
ALTER TABLE t TYPE = BDB;
      
      
       

请参阅13.1.5节,“CREATE TABLE语法”13.1.2节,“ALTER TABLE语法”

如果你试着使用一个未被编译进MySQL的存储引擎,或者试着用一个被编译进MySQL但没有被激活的存储引擎,MySQL取而代之地创建一个MyISAM类型的表。当你在支持不同存储引擎的MySQL服务器之间拷贝表的时候,上述的行为是很方便的。(例如,在一个复制建立中,可能你的主服务器为增加安全而支持 事务存储引擎,但从服务器为更快的速度而仅使用非事务存储引擎。)

在不可用的类型被指定时,自动用MyISAM表来替代,这会对MySQL的新用户造成混淆。无论何时一个表被自动改变之时,产生一个警告。

MySQL总是创建一个.frm文件来保持表和列的定义。表的索引和数据可能被存储在一个或多个文件里,这取决于表的类型。服务器在存储引擎级别之上创建.frm文件。单独的存储引擎创建任何需要用来管理表的额外文件。

一个数据库可以包含不同类型的表。

事务安全表(TST) 比起非事务安全表 (NTST)有几大优势:

·         更安全。即使MySQL崩溃或遇到硬件问题,要么自动恢复,要么从备份加事务日志恢复,你可以取回数据。

·         你可以合并许多语句,并用COMMIT语句同时接受它们全部(如果autocommit被禁止掉)。

·         你可以执行ROLLBACK来忽略你的改变(如果autocommit被禁止掉)。

·         如果更新失败,你的所有改变都变回原来。(用非事务安全表,所有发生的改变都是永久的)。

·         事务安全存储引擎可以给那些当前用读得到许多更新的表提供更好的部署。

虽然MySQL支持数个事务安全存储引擎,为获得最好结果,你不应该在一个事务那混合不同表类型。如果你混合表类型会发生问题,更多信息请参阅13.4.1节,“START TRANSACTION, COMMIT和ROLLBACK Syntax”

如果你没有指定配置值的话,InnoDB使用默认的配置值。请参阅15.2.3节,“InnoDB配置”

非事务安全表自身有几个优点,因为没有事务开支,所有优点都能出现:

·         更快

·         需要更少的磁盘空间

·         执行更新需要更少的内存

你可以在同一个语句中合并事务安全和非事务安全表来获得两者最好的情况。尽管如此,在autocommit被禁止掉的事务里,变换到非事务安全表依旧即时提交,并且不会被回滚。

关注编程学问公众号