Engine

数据库存储引擎,又称数据表处理器,它是数据库底层软件的组织。数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

MySql中的存储引擎

和其他关系数据库有所不同的是,MySQL本身实际上只是一个SQL接口,它的内部包含了多种数据引擎,常见的包括:

  • InnoDB:由Innobase Oy公司开发的一款支持事务的数据库引擎,2006年被Oracle收购;
  • MyISAM:MySQL早期集成的默认数据库引擎,不支持事务。

MySQL内部包含了共九种数据引擎,详细信息见下图。

MySQL接口和数据库引擎的关系就好比某某浏览器和浏览器引擎的关系。对用户而言,切换浏览器引擎不影响浏览器界面,切换MySQL引擎不影响自己写的应用程序使用MySQL的接口。

InnoDB

InnoDB是MySQL的默认引擎,也是目前最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期事务(大部分情况能正常提交,很少被回滚)。同时,InnoDB的性能和崩溃自动恢复特性使得它在非事务型储存的需求中也被广泛使用。若非有特别原因需要使用其他的储存引擎,建议优先考虑InnoDB引擎。
主要特性:

  • 支持事务
  • 灾难恢复性好
  • 为处理巨大数据量的最大性能设计
  • 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取
  • 支持外键完整性约束。存储表中的数据时,每张表的存储都按逐渐顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此作为主键
  • 被用在众多需要高性能的大型数据库站点上

MyISAM

MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎。使用 MyISAM 引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm 文件存储表定义,数据文件的扩展名为 .MYD(MYData),索引文件的扩展名是 .MYI(MYIndex)。
主要特性:

  • 不支持事务
  • 使用表级锁,并发性差
  • 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
  • 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
  • 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
  • 可以把数据文件和索引文件放在不同目录

InnoDB与MyISAM的对比

不同存储引擎都有各自的特点,以适应不同的需求,下表罗列了一些InnoDB与MyISAM功能上的不同点。

差异点 MyISAM InnoDB
构成上的区别 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。存储表定义文件扩展名为.frm;数据文件的扩展名为.MYD (MYData);索引文件的扩展名是.MYI (MYIndex)。 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。
事务处理上方面 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持。 InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能
SELECT UPDATE,INSERT,Delete操作 如果执行大量的SELECT,MyISAM是更好的选择;DELETE FROM table时,MyISAM会重新建立表(更快)。 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
表的具体行数 select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含where条件时,两种表的操作是一样的 InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行
表锁 提供行锁,提供与 Oracle 类型一致的不加锁读取,另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

总之,MyISAM更注重性能,InnoDB提供的功能更多。