MySQL为我们提供了很多存储引擎,有MyISAM、HEAP、BerkeleyDB、InnoDB,MERGE等类型。什么是存储引擎?打个比方,为什么我们写一句create table代码就可以创建一个表,为什么写一句insert 代码就可以向表格插入数据,这些都是由存储引擎完成的。下面我们就来看一下几个比较常用的存储引擎吧。
一。MyISAM表类型:
MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
* MyISAM表(TYPE=MYISAM)是ISAM类型的一种延伸,具有很多优化和增强的特性。
* 是MySQL的默认表类型。
* MyISAM优化了压缩比例和速度,并且可以很方便的在不同的操作系统和平台之间进行移植。
* MyISAM支持大表文件(大于4G)
* 允许对BLOB和TEXT列进行索引
* 支持使用键前缀和使用完整的键搜索记录
* 表数据和表索引文件可以依存在不同的位置,甚至是不同的文件系统中。
* 即使是具有相当多的插入、更新和删除操作的表,智能防碎片逻辑也能保证其高性能的协作性。
二。InnoDB存储引擎:
InnoDB存储引擎现已被Oracle收购。
InnoDB存储它的表的定义文件依然是被放在c盘的data文件夹中格式是.frm。但表数据和索引文件被放在在一个表空间中,这个表空间名是ibdata1,我们在安装Mysql时,会要求我们指定InnoDB表空间ibdata1的路径。ibdata1是介于文件和文件夹之间的一种文件,我们无法打开它。ibdata1表空间可以 包含无数个独立的表格数据文件和索引文件(或原始磁盘分区)。
InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
三。MERGE存储引擎:
MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。
- * MERGE表(TYPE=MERGE)是通过把多个MyISAM表组合到一个单独的表来创建的一种虚拟表。
- * 只有涉及到的表具有完全相同的表结构时才能对表进行组合。字段类型或者索引的任何不同都不能进行成功的结合。
- * MERGE表使用组成表的索引,并且不能维持它本身的索引,在某种情况下可以提高速度。
- * 允许SELECT,DELETE,UPDATE操作
- * 在需要把不同表的数据放到一起提高连接的性能或者在一系列表中进行搜索时,这种表很实用。
- * 处理大的MyISAM表时,我们可以通过压纹或者使用MySQL发布中包含的myisampack实用工具进行“打包”来减少这些表战胜的空间。 myisampack创建比较小的只读表,而不会在使用智能压缩时导致任何大的性能开销。
四。MEMORY (HEAP)存储引擎:
MEMORY存储引擎用存在内存中的内容来创建表。这些在以前被认识为HEAP表。MEMORY是一个首选的术语,虽然为向下兼容,HEAP依旧被支持。
每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。
MEMORY表被存储在内存中,且默认使用哈希索引。这使得它们非常快,并且对创建临时表非常有用。可是,当服务器关闭之时,所有存储在 MEMORY表里的数据被丢失。因为表的定义被存在磁盘上的.frm文件中,所以表自身继续存在,在服务器重启动时它们是空的。
- * 给MEMORY表的空间被以小块来分配。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在你往表里插入新数据之时被重新使用。MEMORY表也没有通常与在哈希表中删除加插入相关的问题。
- *MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。
- *MEMORY存储引擎执行HASH和BTREE索引。
- *你可以在一个MEMORY表中有非唯一键。(对哈希索引的实现,这是一个不常用的功能)。
- *你可以对MEMORY表使用INSERT DELAYED。
- *如果你在一个有高度键重复的(许多索引条目包含同一个值)MEMORY表上有一个哈希索引,对影响键值的表的更新及所有删除都是明显地慢的。这个变慢的程度比例于重复的程度(或者反比于索引cardinality)。你可以使用一个B树索引来避免这个问题。
- *MEMORY表使用一个固定的记录长度格式。
- *MEMORY不支持BLOB或TEXT列。
- *MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。
- *MEMORY表在所有客户端之间共享(就像其它任何非TEMPORARY表)。
- *MEMORY表内容被存在内存中,内存是MEMORY表和服务器在查询处理之时的空闲中创建的内部表共享。
- *如果你正使用复制,当主服务器被关闭且重启动之时,主服务器的MEMORY表变空。可是从服务器意识不到这些表已经变空,所以如果你从它们选择数据,它就返回过时的内容。自从服务器启动后,当一个MEMORY表在主服务器上第一次被使用之时,一个DELETE FROM语句被自动写进主服务器的二进制日志,因此再次让从服务器与主服务器同步。注意,即使使用这个策略,在主服务器的重启和它第一次使用该表之间的间隔中,从服务器仍旧在表中有过时数据。可是,如果你使用–init-file选项于主服务器启动之时在其上推行MEMORY表。它确保这个时间间隔为零。
五。BDB (BerkeleyDB) 存储引擎:
Sleepycat Software给MySQL提供Berkeley DB事务性存储引擎。这个存储引擎典型被简称为BDB。对BDB存储引擎的支持包括在MySQL源码分发版里,在MySQL-Max二进制分发版里被激活。
BDB表可能有一个更大的崩溃幸存机会,并且也具有对事务COMMIT和ROLLBACK操作的能力。MySQL源码分发版和被补丁过可以与MySQL一起工作的BDB分发版一起提供。你不能使用一个未补丁过的BDB版本与MySQL一起工作。。
我们在MySQL AB上与Sleepycat紧密合作工作以保持MySQL/BDB接口的质量在高水平。(即使Berkeley DB其本身是非常能经受考验和非常可靠的。MySQL接口仍然被认为是第三等质量的。我们将继续改善和优化它)。
当它达到对所有涉及BDB表的问题的支持之时,我们答应负责帮助我们的用户定位问题并创建可重复产生的测试案例。任何这样的测试案例被转交给Sleepycat,它反过来帮助我们找到并解决问题。因为这是一个二阶段的操作,任何关于BDB表的问题我们可能要花比对其它存储引擎稍微更长一点的时间来解决它。可是,我们期望这个过程没有显著的困难,因为Berkeley DB 代码本身被用在MySQL之外许多的应用中。
不过BerkeleyDB表也有一些限制,让我们简单的了解一下:
- * 它的移动比较困难(在创建时,表路径硬编码在表文件中)
- * 不能压缩表索引,而且其表通常比MyISAM相应的表要大
- * 有点鸡肋的感觉,因为现在InnoDB格式很大程度上可以取代BerkeleyDB格式
更多请参考MYsql官方中文手册 http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb