MySQL数据库引擎,InnoDB和MyISAM的区别

什么是数据库引擎

数据库引擎,也称为存储引擎(Storage Engine),是数据库管理系统(DBMS)对数据库中的数据做CRUD操作的底层软件组件。大多数数据库管理系统有自己的API,用户可以直接与底层引擎进行交互,而不需要去使用DBMS的用户接口。

本文简单介绍两个主要MySQL引擎InnoDB和MyISAM的区别。

查看引擎

1
show engines;

结果为mysql支持的数据库引擎列表信息,略。

InnoDB和MyISAM

InnoDB

InnoDBInnoDB是MySQL的一种数据库引擎,MySQL5.5及之后的版本将其作为默认引擎。它服从和提供了标准的ACID事务特征和外键支持。

  1. InnoDB支持行级别的锁。
  2. InnoDB在设计时主要考虑处理量级较大数据时的性能最优化。
  3. InnoDB支持外键,因此我们把使用InnoDB的MySQL称为关系数据库管理系统(RDBMS)。
  4. InnoDB在表空间中存储数据和索引。
  5. InnoDB支持事务,用InnoDB,你可以在提交和回滚。
  6. InnoDB在MySQL5.6之后也支持全文索引。
  7. InnoDB默认将所有数据存储在一个文件中(可以在创建表时通过设定innodb_file_per_table选项来设定文件数)。

MyISAM

MyISAM在MySQL5.5版本之前是默认的数据库引擎,它基于更老的ISAM码,但是MyISAM有许多实用的扩展。

  1. MyISAM支持表级别的锁。
  2. MyISAM在设计时主要考虑速度。
  3. MyISAM不支持外键,因此我们把使用MyISAM的MySQL称为数据库管理系统(DBMS)。
  4. MyISAM在磁盘空间上用三个不用的文件分别存储表,数据,和索引,三个文件依次是tablename.FRM,tablename.MYD, tablename.MYI。
  5. MyISAM不支持事务,用MyISAM,你不能提交和回滚,当你执行了一条命令,就已经永久生效了。
    MyISAM支持全文索引。
  6. 当表存在大量查询而只有少量更新和删除时,推荐使用MyISAM。

MyISAM是由Oracle开发的。据说MyISAM整体上更快,因为它的结构更简单,占用的资源更少。

如何选择

在上文的区别对比中我们看到,有一些InnoDB的特性是MyISAM没有的。二者的主要区别在于,InnoDB支持外键和事务,而MyISAM不支持。
当我们做选择时,首先确定我们是否需要使用外键和事务,如果可以不用,MyISAM才能在考虑范围之内。
如果数据单一,而自己又很在意MyISAM的细微的优点,可以选择MyISAM,但并不是所有情况下MyISAM的读取速度都更优。
大多数情况下都建议使用InnoDB。
参考3中有较详细的基本性能对比测试报告。

参考

  1. What’s the difference between MyISAM and InnoDB? - StackOverflow
  2. When to use MyISAM and InnoDB? - StackOverflow
  3. MyISAM versus InnoDB? - StackOverflow