MySQL常见数据库引擎及比较

一:MySQL存储引擎简介

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,你们能够择优选择使用:MyISAMInnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。linux

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

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

  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二进制分发版里提供。这个存储引擎当前只被LinuxSolaris, 和Mac OS X 支持。在将来的MySQL分发版中,咱们想要添加其它平台对这个引擎的支持,包括Windows数据结构

  ARCHIVE存储引擎被用来无索引地,很是小地覆盖存储的大量数据。并发

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

  BLACKHOLE存储引擎接受但不存储数据,而且检索老是返回一个空集。工具

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

  当你建立一个新表的时候,你能够经过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要建立什么类型的表:

    CREATE TABLE t (i INT) ENGINE = INNODB;

    CREATE TABLE t (i INT) TYPE = MEMORY;

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

二:如何选择最适合你的存储引擎呢?

下述存储引擎是最经常使用的:

  MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。注意,经过更改STORAGE_ENGINE配置变量,可以方便地更改MySQL服务器的默认存储引擎。

  InnoDB:用于事务处理应用程序,具备众多特性,包括ACID事务支持。(提供行级锁)

  BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其余事务特性。

  Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问。

  Merge:容许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

  Archive:为大量不多引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

  Federated:可以将多个分离的MySQL服务器连接起来,从多个物理服务器建立一个逻辑数据库。十分适合于分布式环境或数据集市环境。

  Cluster/NDB:MySQL的簇式数据库引擎,尤为适合于具备高性能查找要求的应用程序,这类查找需求还要求具备最高的正常工做时间和可用性。

  Other:其余存储引擎包括CSV(引用由逗号隔开的用做数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速建立定制的插件式存储引擎提供帮助)。

三:各存储引擎之间的区别

存储引擎的核心功能把不一样的存储引擎区别开来。咱们 通常把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理

字段和数据类型

  虽然全部这些引擎都支持通用的数据类型,例如整型、实型和字符型等,可是,并非全部的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。

  这些局限性可能直接影响到你能够存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息建立的索引产生间接的影响。这些区别可以影响你的应用程序的性能和功能,由于你必需要根据你要存储的数据类型选择对须要的存储引擎的功能作出决策。

锁定

  数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成以前,其它处理不能修改这个数据(在某些状况下还不容许读这种数据)。

  锁定不只影响许多不一样的应用程序如何更新数据库中的信息,并且还影响对那个数据的查询。这是由于查询可能要访问正在被修改或者更新的数据。总的 来讲,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。因为向数据中插入信息和更新信息这两种状况都须要锁定,你能够想象,多个 应用程序使用同一个数据库可能会有很大的影响。

  不一样的存储引擎在不一样的对象级别支持锁定,并且这些级别将影响能够同时访问的信息。获得支持的级别有三种:表锁定、块锁定和行锁定。支持最多的 是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用不少的多用户数据库 有很大的影响,由于它延迟了更新的过程。

  页级锁定使用Berkeley DB引擎,而且根据上载的信息页(8KB)锁定数据。当在数据库的不少地方进行更新的时候,这种锁定不会出现什么问题。可是,因为增长几行信息就要锁定数据结构的最后8KB,当须要增长大量的行,特别是大量的小型数据,就会带来问题。

  行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着不少应用程序可以更新同一个表中的不一样行的数据,而不会引发锁定的问题。只有InnoDB存储引擎支持行级锁定。

创建索引

  创建索引在搜索和恢复数据库中的数据的时候可以显著提升性能。不一样的存储引擎提供不一样的制做索引的技术。有些技术也许会更适合你存储的数据类型。

  有些存储引擎根本就不支持索引,其缘由多是它们使用基本表索引(如MERGE引擎)或者是由于数据存储的方式不容许索引(例如FEDERATED或者BLACKHOLE引擎)。

事务处理

  事务处理功能经过提供在向表中更新和插入信息期间的可靠性。这种可靠性是经过以下方法实现的,它容许你更新表中的数据,但仅当应用的应用程序的 全部相关操做彻底完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你须要要使用事务处理功能保证 对借方科目和贷方科目的数据更改都顺利完成,才接受所作的修改。若是任一项操做失败了,你均可以取消这个事务处理,这些修改就不存在了。若是这个事务处理 过程完成了,咱们能够经过容许这个修改来确认这个操做。

四:MySQL存储引擎比较

MySQL经常使用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其余存储引擎都是非事务安全表。 

4.1 MyISAM

  MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问(读)速度快,对事务完整性没有要求。 
  MyISAM除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的MyISAMPACK工具。MYISAM强调了快速读取操做,这可能就是为何MySQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
  InnoDB存储引擎提供了具备提交、回滚和崩溃恢复能力的事务安全。可是比起MyISAM存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。 

4.2 MEMORY/HEAP

  MEMORY(又叫HEAP)存储引擎使用存在内存中的内容来建立表。每一个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问很是得快,由于它的数据是放在内存中的,而且默认使用HASH索引。可是一旦服务关闭,表中的数据就会丢失掉。 HEAP容许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,可是它所管理的数据是不稳定的,并且若是在关机以前没有进行保存,那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很是有用。
  MEMORY主要用于那些内容变化不频繁的代码表,或者做为统计操做的中间结果表,便于高效地堆中间结果进行分析并获得最终的统计结果。

4.3 MERGE

  MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构彻底相同。MERGE表自己没有数据,对MERGE类型的表进行查询、更新、删除的操做,就是对内部的MyISAM表进行的。 MERGE用于将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为一个对象引用它。MERGE表的优势在于能够突破对单个MyISAM表大小的限制,经过将不一样的表分布在多个磁盘上,能够有效的改善MERGE表的访问效率。
  MyISAM与InnoDB的区别
    InnoDB和MyISAM是许多人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差异为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
  MyISAM表还支持3中不一样的存储格式:  静态表 、 动态表 三、压缩表 
  静态表是默认的存储格式,静态表中的字段都是非变长的字段,优势是:存储很是迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间一般比动态表多。(注意: 在存储时,列的宽度不足时,用空格补足,当时在访问的时候并不会获得这些空格) 
  动态表的字段是变长的,优势是:占用的空间相对较少,可是频繁地更新删除记录会产生碎片,须要按期改善性能,而且出现故障的时候恢复相对比较困难。 
  压缩表占用磁盘空间小,每一个记录是被单独压缩的,因此只有很是小的访问开支。 
  InnoDB存储方式为两种:使用共享表空间存储 、使用多表空间

五:总结

ISAM:
  ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实时数据,经过其复制特性,MYSQL可以支持这样的备份应用程序

MyISAM:
  MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操做,这可能就是为何MySQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

  插入数据快,空间和内存使用比较低。若是表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。若是应用的完整性、并发性要求比较低,也可
以使用。

InnoDB:
  InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者或者二者,那你就要被迫使用后两个引擎中的一个了。

  支持事务处理,支持外键,支持崩溃修复能力和并发控制。若是须要对事务的完整性要求比较高(好比银行),要求实现并发控制(好比售票),那选择InnoDB有很大的优点。若是须要频繁的更新、删除操做的数据库,也能够选择InnoDB,由于支持事务的提交(commit)和回滚(rollback)。

MEMORY:
  MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来建立表,并且数据所有放在内存中。这些特性与前面的两个很不一样。每一个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提升整个表的效率。值得注意的是,服务器须要有足够的内存来维持MEMORY存储引擎的表的使用。若是不须要了,能够释放内存,甚至删除不须要的表。MEMORY默认使用哈希索引。速度比
使用B型树索引快。固然若是你想用B型树索引,能够在建立索引时指定。注意,MEMORY用到的不多,由于它是把数据存到内存中,若是内存出现异常就会影响数据。若是重启或者关机,全部数据都会消失。所以,基于MEMORY的表的生命周期很短,通常是一次性的

  全部的数据都在内存中,数据的处理速度快,可是安全性不高。若是须要很快的读写速度,对数据的安全性要求较低,能够选择MEMOEY。它对表的大小有要求,不能
创建太大的表。因此,这类数据库只使用在相对较小的数据库表。 

注意:

  同一个数据库也可使用多种存储引擎的表。若是一个表要求比较高的事务处理,能够选择InnoDB。这个数据库中能够将查询要求比较高的表选择MyISAM存储。若是该 数据库须要一个用于查询的临时表,能够选择MEMORY存储引擎。

相关文章
相关标签/搜索