对于 MySQL 初学者来说,如果您希望更深入的了解 MySQL 存储引擎原理或者提高 MySQL 数据库的性能,您可能需要了解 MyISAM 和 InnoDB 这两种著名的 MySQL 存储引擎之间的所有差异。通过阅读本文,我们相信您会想了解每种引擎能提供什么以及哪一种更适合您的软件。

什么是 MyISAM 引擎?

在 MySQL 产品创建初期,MyISAM 被认为是更好的选择也是 MySQL 的默认存储引擎,该引擎执行快速且针对大量读操作进行了优化。因此它被用于许多不同的事情,从执行数据分析到为论坛开发简单的内容管理系统或构建较小的搜索引擎。一些开发者创建了专门针对 MyISAM 的工具和解决方案,因为它被认为比 InnoDB 更简单。实际上,许多开发者使用 MySQL 接触到的第一种存储引擎就是 MyISAM。但是从 2009 年发行的 MySQL 5.6 版本开始,它被 InnoDB 替换为默认的 MySQL 存储引擎。尽管如此,它仍为 MySQL 开发者提供了许多有用的扩展。

什么是 InnoDB 引擎?

InnoDB 引擎是 MySQL 的一种通用存储引擎,它已从一个存储子系统发展成为一个成熟的存储引擎。从5.6 版本开始,由于其高性能和可靠性的结合,它成为了 MySQL 的默认引擎。与 MySAM 引擎的一个最重要的区别就是 InnoDB 引擎支持事务操作,虽然 MySQL 决定了数据保存到数据库的方式,但 InnoDB 存储引擎将数据存储在磁盘上或保留在主内存中以便快速访问。当一个事务完成时,数据会根据事务被写入存储介质。需要注意的是,未完成的更改不会被存储在数据库中。

MyISAM 与 InnoDB 的主要区别

概括的说,InnoDB 是一款更新且效率更高的存储引擎,现代开发中,我们强烈推荐您默认采用 InnoDB 引擎。

这两种引擎之间最常被提及的区别如下:InnoDB 更稳定、更快、更容易设置,同时它还支持事务操作。它之所以后来居上成为默认的存储引擎选择是有原因的,您可以使用 InnoDB 的功能而不必担心兼容性问题。

MyISAM 引擎不擅长存储大量数据,因为它将所有数据存储在一个表中。当您需要向数据库添加数据时,您必须锁定整个表,这可能导致您的数据库停止工作,直到它被解锁。在 InnoDB 引擎中,每一行都分别存储在不同的表中。这意味着当您向 MySQL 数据库插入数据时,您不需要锁定所有行。

接下来,让我们来更详细地分析两款存储引擎的区别。

事务

InnoDB 是一个事务型存储引擎,而 MyISAM 属于非事务型类别。前者意味着,如果您的数据操作涉及到事务,那么在事务未完成的情况下将 InnoDB 引擎将会自动触发回滚。这显然比 MyISAM 更值得推荐,MyISAM 不支持事务,您只能在需要的情况下手动回滚事务。

ACID

原子性、一致性、隔离性和持久性是众所周知的 ACID 原则。在发生错误或系统故障的情况下,遵守这些属性保证了事务将被完成。InnoDB 完全的遵守 ACID 原则,MyISAM 则没有。

性能

InnoDB 支持事务属性。它提供了更高的代码写入速度,具有回滚和提交功能。InnoDB处理大量数据的性能优于 MyISAM。虽然 MyISAM 读取速度更快,但其不支持事务属性,其处理大量数据的性能与InnoDB 相比有很大的不足。

外键支持

表的外键是一组引用另一个表主键的属性。一个表可以有多个外键,每个外键可以有不同的父表。使用MyISAM 时,您不能添加外键约束,而 InnoDB 完全支持此功能。

表级锁定与行级锁定

当激活锁定选项时,两个或更多用户不能同时修改相同的数据。这个功能保证了数据的有效性。

MyISAM 的默认锁定方法是表锁定 ,它允许您在单个会话中修改表。表按照一定顺序被锁定。表锁定方法可用于不需要大量内存的只读数据库。

而 InnoDB 默认的锁定方法是行级锁定。行被锁定以支持在选定行上的多个会话。这对于需要多个活跃用户的数据库来说是极大的优势。

简而言之:InnoDB 提供灵活的行级锁,而 MyISAM 只能进行表级锁。InnoDB 的崩溃恢复也更为优越。

缓存和索引

最后是 nnoDB 和 MyISAM 中的缓存和索引区别。

在 InnoDB 中,有一个大的缓冲池可用于存储数据和索引。

而 MyISAM 中有一个关键缓冲区用于索引。同时,主要的缓存机制是缓存键,它使用MYI文件来缓存页面。

结论

现代开发中,除非你的项目中只有或者绝大部分的需求都是 select 查询时,可以考虑使用 MyISAM 引擎。否则一律推荐使用 InnoDB 引擎。