其实 MySQL 提供的表类型截至到今天已经有 13 种,各有各的好处,但是民间流传的常用的应该是 7 种,如果再细化出来,基本上就只有两种:InnoDB、MyIASM 两种。
MySQL 作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于 MySQL 的内部环境不很了解,尤其那些针对并发性处理的机制。
MySQL 向用户提供了包括 DBD、HEAP、ISAM、MERGE、MyIAS、InnoDB 以及 Gemeni 这 7 种 MySQL 表类型。其中 DBD、InnoDB 属于事务安全类表,而其他属于事务非安全类表。
1、DBD
Berkeley DB(DBD) 表是支持事务处理的表,由 Sleepycat 软件公司开发。它提供 MySQL 用户期待已久的功能 — 事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行或回滚。
BerkeleyDB 表 (TYPE=BDB) 是为了满足 MySQL 开发者对事务安全表日益增长的需求而发展起来的。BerkeleyDB 表具有特性,包括提交和回滚操作、多用户并发访问、检查点、次要索引、通过日志恢复崩溃、连续地和键控地访问数据等,这便利复杂的、基于事务的 SQL 有了可行的选择。
不过 BerkeleyDB 表也有一些限制:
- 它的移动比较困难 (在创建时,表路径硬编码在表文件中)
- 不能压缩表索引,而且其表通常比 MyISAM 相应的表要大
- 有点鸡肋的感觉,因为现在 InnoDB 格式很大程度上可以取代 BerkeleyDB 格式
2、HEAP
HEAP 表是 MySQL 中存取数据最快的表。这是因为他们使用存储在动态内存中的一个散列索引,不过如果 MySQL 或服务器崩溃,这些内存数据将会丢失。
HEAP 表 (TYPE=HEAP) 是内存中的表,它使用能够比较快速的散列索引(当运行 INSERT 查询时,独立评价指出 HEAP 表最少比 MyISAM 表快 30%),因此,对于临时表可以优化。经和 MyISAM 或 ISAM 表的访问规则和使用方式一样。存储在里面的数据只在 MySQL 服务器的生命期内存在,如果 MySQL 服务器崩溃或者被关掉,都会使其中的数据消失不见。虽然 HEAP 表具有性能方面的好处,但是由于它的临时性和一些其他功能限制,在实际中不可能经常使用。
HEAP 表的大小只受到系统上可用内存的限制,MySQL 是很聪明的,其具有内建保护来阻止无意识地使用所有可用内存。所以我们不用担心内存会被 HEAP 表用尽。HEAP 表不支持 BLOB 或 TEXT 列,不能超过 max_heap_table_size 变量指定的大小。
3、ISAM
ISAM 表是早期 MySQL 版本的缺省表类型,直到 MyIASM 开发出来。建议不要再使用它。
ISAM 表 (TYPE=ISAM) 和 MyISAM 表相似,但是其没有 MyISAM 格式的很多增强性能,因而不能像 MyISAM 类型那样提供很好的优化和执行效率。因为 ISAM 索引不能被压缩,它比在 MyISAM 中的相同索引战胜较少的系统资源。ISAM 索引需要较多的磁盘空间,这对于像本站的这种小型环境很是问题。
和 MyISAM 一样,ISAM 表可以是固定长度的,也可以是可变长度的,但是其格式的最大键长度比较小,ISAM 格式处理的表不能大于 4G,而且表不能在不同的平台间移植。另外,ISAM 表容易分裂,这会降低查询速度,对数据/索引的压缩产生限制。
4、MERGE
MERGE 是一个有趣的新类型,在 3.23.25 之后出现。一个 MERGE 表实际上是又一个 MyISAM 表的集合,合并而成的一个表,主要是为了效率的考虑,因为这样不仅仅可以提高速度、搜索效率、修复效率而且还节省了磁盘空间。
- MERGE 表 (TYPE=MERGE) 是通过把多个 MyISAM 表组合到一个单独的表来创建的一种虚拟表。
- 只有涉及到的表具有完全相同的表结构时才能对表进行组合。字段类型或者索引的任何不同都不能进行成功的结合。
- MERGE 表使用组成表的索引,并且不能维持它本身的索引,在某种情况下可以提高速度。
- 允许 SELECT,DELETE,UPDATE 操作
- 在需要把不同表的数据放到一起提高连接的性能或者在一系列表中进行搜索时,这种表很实用。
- 处理大的 MyISAM 表时,我们可以通过压纹或者使用 MySQL 发布中包含的 myisampack 实用工具进行 “打包” 来减少这些表战胜的空间。myisampack 创建比较小的只读表,而不会在使用智能压缩时导致任何大的性能开销。
5、MyIASM
MyIASM 基于了 IASM 代码,应该可以说是 IASM 的衍生品,不过增加了不少有用的扩展。它是 MySQL 的默认数据表类型,基于了传统的 ISAM 类型,ISAM 是 Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,一般来说,它是存储记录和文件的标准方法。与其他存储引擎比较,MyISAM 具有检查和修复表格的大多数工具。ISAM 表格可以被压缩,而且它们支持全文搜索,不过它们是事务不安全的,而且也不支持外键。如果事务回滚将会造成不完全回滚,从而不具备原子性。所以假如忽略事务以及访问并发性的话,并且需要执行大量的 SELECT 检索语句的话,MyISAM 将是最好的选择。
- MyISAM 表 (TYPE=MYISAM) 是 ISAM 类型的一种延伸,具有很多优化和增强的特性。
- 是 MySQL 的默认表类型。
- MyISAM 优化了压缩比例和速度,并且可以很方便的在不同的操作系统和平台之间进行移植。
- MyISAM 支持大表文件 (大于 4G)
- 允许对 BLOB 和 TEXT 列进行索引
- 支持使用键前缀和使用完整的键搜索记录
- 表数据和表索引文件可以依存在不同的位置,甚至是不同的文件系统中。
- 即使是具有相当多的插入、更新和删除操作的表,智能防碎片逻辑也能保证其高性能的协作性。
6、InnoDB
InnoDB 是 MySQL 4.0 之后推出的一种比较新的数据表类型,这种类型是事务安全的。它与 BDB 类型具有相同的特性,它们还支持外键。InnoDB 表格速度很快具有比 BDB 还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它。如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,同样应该使用 InnoDB 表。对于支持事务的 InnoDB 类型的表来说,影响速度的主要原因是 AUTOCOMMIT 默认设置是打开的,而且程序没有显式调用 BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度。可以在执行 SQL 前调用 begin,多条 SQL 形成一个事物(即使 autocommit 打开也可以),将大大提高性能。
InnoDB 表 (TYPE=INNODB),是一个完全兼容 ACID(事务的原子性、一致性、独立性及持久性)的、高效率的表完全支持 MySQL 的事务处理并且不会 btwagkyaakftntce。精细的(行级和表级)锁提高了 MySQL 事务处理的带走度,同时其也支持无锁定读操作(以前只在 Oracle 中包含)和多版本的特性。
异步输入 / 输出和一系列的读缓冲将提高数据检索速度,同时可以进行文件的优化和内存的管理。需要的基础上支持自动在内存上创建散列索引来提高性能,使用缓冲来提高可靠性和数据库操作的速度。InnoDB 表可以和 MyISAM 相媲美,甚至已经超过了 MyISAM。
在不同的操作系统和体系结构上是完全可移植的。由于一直处于一致的状态(MySQL 通过在启动时检查错误并修复错误来使它们更加健壮)。对外键、提交、回滚和前滚的操作的支持,使其成为 MySQL 中最完善的表格式。
7、Gemeni
Gemeni 表,据听说也是在 MySQL 4.0 之后推出的,不过截至当前,很少有针对它的介绍,同样应用也就更少了,我们暂时不作介绍。
总结:
MySQL 的数据表类型很多,其中比较重要的是 MyISAM,InnoDB 这两种。
这两种类型各有优缺点,需要根据实际情况选择适合的,MySQL 支持对不同的表设置不同的类型。下面做个简单的对比:
MyISAM 表类型是一种比较成熟稳定的表类型,但是 MyISAM 对一些功能不支持。
参考:
http://database.51cto.com/art/201010/230057.htm(以上内容部分转自此篇文章)
http://www.xiaoxiaozi.com/2009/07/14/1171/(以上内容部分转自此篇文章)