InnoDB和MyISAM有什么区别?


17

我正在使用MySQL作为当前Web项目的数据库。我是MySQL的新手。请向我解释InnoDB和MyISAM之间的区别。


随时添加一个MySQL tagg :)
Johan

这不属于stackoverflow吗?
ripper234

@ ripper234。SO上存在此帖子的两个更好的版本(更多的背景知识;以前的研究的更多示例):stackoverflow.com/q/12614541/209139stackoverflow.com/q/20148/209139
TRiG 2015年

Answers:


14

ISAM =索引顺序访问方法,本质上是一个平面文件(对于那些可以记住,认为Btrieve或B-Tree的DBA)。这是一项非常古老的技术-但是不要让它让您停止使用它。因为它是一个平面文件(稍后会详细介绍),所以它不是关系文件,因此不是RDBMS,因此在某些情况下更合适。

InnoDB是您可能最熟悉的完整RDBMS。MyISAM似乎是通过在顶部添加的另一层保持关系,保持链接,逻辑和引用完整性的关系。

如果您有很多记录(例如2000万条),并且大多数记录都是独立记录的(即,您不需要做很多链接来检索关联的数据),则ISAM非常出色。它非常依赖于索引,如果您没有正确的索引,请为非常长的查询时间做好准备。恰当的例子:我们有一个Btrieve ISAM表,具有20M +条记录,并且基于准确的索引进行检索和过滤数据几乎是即时的。使用错误的索引实际上是15分钟。

如果您有很多关系链接,InnoDB非常适合。表A引用了表B中的一个字段,后者引用了表C和D。InnoDB可以使用各种不错的联接方法(哈希联接等)来获取这些记录,而ISAM数据库则必须为每个单个数据库运行多个子查询。行并手动匹配记录。

如果您想了解更多细节,那么您真的必须在数据库中学习课程!


ISAM和其他任何关系一样,只是没有针对它进行优化。
LapTop006

谢谢4的简短说明。现在基本上我已经清除了

5

最基本的是InnoDB是事务性的。MyIsam不是。MyIsam通常更快一些,因此,如果您不需要通常最好的交易。有关详细说明,您应该阅读MySQL文档。


2

除非您使用表来存储日志样式数据,否则这些天(InnoDB通常更快,更可靠,具有更多功能等),除非您使用表来存储日志样式数据(比INSERT多很多SELECT,而且没有事务)。

MyISAM唯一的其他功能是全文搜索,适合基本使用,但是大多数人会使用Lucene的某些功能进行严重的搜索。

无论哪种方式,您都必须调整MySQL,因为默认情况下,默认值是为与其他服务共享的32MB奔腾设置的。


2

游戏有点晚了……但是这是我几个月前写的一篇非常全面的文章,详细介绍了MYISAM和InnoDB之间的主要区别。拿起一杯(可能还有饼干),然后享用。


MyISAM和InnoDB之间的主要区别在于引用完整性和事务。还有其他区别,例如锁定,回滚和全文本搜索。

参照完整性

参照完整性可确保表之间的关系保持一致。更具体地说,这意味着当一个表(例如清单)具有指向另一个表(例如产品)的外键(例如产品ID)时,当指向该表的更新或删除发生时,这些更改将级联到链接中表。在我们的示例中,如果产品被重命名,则链接表的外键也会更新;如果从“产品”表中删除了产品,则指向已删除条目的所有列表也会被删除。此外,任何新列表都必须具有指向有效的现有条目的外键。

InnoDB是一个关系DBMS(RDBMS),因此具有参照完整性,而MyISAM没有。

交易与原子性

使用数据操作语言(DML)语句(例如SELECT,INSERT,UPDATE和DELETE)来管理表中的数据。一个事务将两个或多个DML语句组合在一起成为一个工作单元,因此要么应用整个单元,要么不应用。

MyISAM不支持事务,而InnoDB支持。

如果在使用MyISAM表时操作被中断,则该操作将立即中止,并且即使操作未完成,受影响的行(甚至每一行中的数据)仍会受到影响。

如果在使用InnoDB表时操作被中断,因为该操作使用具有原子性的事务,则任何未完成的事务都不会生效,因为不会进行提交。

表锁定与行锁定

当查询针对MyISAM表运行时,查询所在的整个表将被锁定。这意味着后续查询仅在当前查询完成后才执行。如果您正在读取一个大表,并且/或者频繁进行读写操作,那么这可能意味着大量的查询积压。

当查询针对InnoDB表运行时,只有所涉及的行被锁定,该表的其余部分仍可用于CRUD操作。这意味着查询可以在同一表上同时运行,前提是它们不使用同一行。

InnoDB中的此功能称为并发。就并发性而言,最大的缺点是它适用于选定的表范围,因为在内核线程之间进行切换会产生开销,因此您应该对内核线程设置一个限制,以防止服务器停机。

交易和回滚

当您在MyISAM中运行操作时,将进行更改。在InnoDB中,这些更改可以回滚。用于控制事务的最常见命令是COMMIT,ROLLBACK和SAVEPOINT。1. COMMIT-您可以编写多个DML操作,但所做的更改仅在进行COMMIT时保存。2. ROLLBACK-您可以丢弃尚未提交的所有操作3. SAVEPOINT-在以下列表中设置一个点ROLLBACK操作可以回滚到的操作

可靠性

MyISAM不提供数据完整性-硬件故障,不正常关机和取消的操作都可能导致数据损坏。这将需要完全修复或重建索引和表。

另一方面,InnoDB使用事务日志,双重写入缓冲区以及自动校验和和验证来防止损坏。在InnoDB进行任何更改之前,它会将事务之前的数据记录到名为ibdata1的系统表空间文件中。如果发生崩溃,InnoDB将通过重播这些日志来自动恢复。

全文索引

在MySQL版本5.6.4之前,InnoDB不支持FULLTEXT索引。在撰写本文时,许多共享的托管服务提供商的MySQL版本仍低于5.6.4,这意味着InnoDB表不支持FULLTEXT索引。

但是,这不是使用MyISAM的有效理由。最好改用支持MySQL最新版本的托管服务提供商。并不是使用FULLTEXT索引的MyISAM表不能转换为InnoDB表。

结论

总之,InnoDB应该是您选择的默认存储引擎。当它们满足特定需要时,请选择MyISAM或其他数据类型。


1

通常,经验法则是,如果要提高速度,请使用MyISAM;如果要稳定,请使用InnoDB。如果我没记错的话,这与原子性有关。


3
除了不再是事实,InnoDB实际上在大多数情况下都更快。
LapTop006

1
有人可以添加一些基准或其他内容的链接吗?
约翰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.