当MyISAM比InnoDB更好用?

11
有时我会在面试中被问到:InnoDB相比MyISAM有哪些好处?以及什么情况下MyISAM更优于InnoDB?第一个问题的答案很清楚:InnoDB是事务兼容的,行级别阻塞而不是表级别阻塞,支持外键等。这些点立即就浮现在脑海中。
但是,在什么情况下MyISAM确实比InnoDB更好呢?
6个回答

15

当您不需要那些高级特性,且存储速度比其他问题更重要时,MyISAM优于InnoDB。

使用MyISAM还允许在数据库引擎内部执行全文搜索,而无需在应用程序中将结果查询并搜索它们作为数组或其他形式。

如果您需要存储具有复杂交互和关系的数据,则InnoDB是一个合理的选择。如果您需要在短时间内保存或加载大量记录,则MyISAM是一个合理的选择。

我不建议使用MyISAM处理重要数据。它非常适合日志记录、评论字段或任何您不介意记录消失的情况。InnoDB适用于您关心数据,不需要快速搜索并且必须使用MySQL的情况。

值得一提的是,InnoDB支持行级锁定,而MyISAM仅支持表级锁定 - 这意味着对于许多常见情况,由于更多查询并行执行,InnoDB可能会显著加快速度。

最重要的是:除非您确实必须使用MyISAM,否则请使用InnoDB。或者,开发针对PostgreSQL,并获得两者的最佳效果。


1
这还要看情况。如果您需要ACID保证,那么MyIASM并不适合您。即使您需要速度。 - user166390
实际上,我刚刚修改了我的帖子以反映这一点。正如我在编辑后的文本中所暗示的那样,我无法认同MySQL在任何非常重要的事情中的使用。 - Winfield Trail
让我们开始这个派对吧。 https://lxadm.com/MySQL:将所有数据库中的所有表从MyISAM转换为InnoDB - Luka
1
对于那些像我一样好奇的人,ACID代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这是一组数据库事务属性,旨在保证数据的有效性。 - Aaron Swan

5

MyISAM不支持事务(和其他提到的功能),因此它可以更快地工作。 MyISAM是在您不需要这些功能的情况下实现更高性能的一种方式。


1
这些特性是使关系型数据库管理系统成为关系型数据库管理系统的一切:ACID(这有点夸张,但仍然...) - user166390
3
相信我,当你需要额外的性能时,放弃关系型数据库的这些特性通常是可行的选择。查看当前流行的NoSQL解决方案,重新考虑对ACID必要性的看法。 - Karoly Horvath
问题在于MySQL以一种有害其所宣传的工作能力的方式丢弃它们。MyISAM因为吃掉数据而臭名昭著,原因是奇怪或未知的,而流行的NoSQL解决方案则成功地管理了关系逻辑,而不会破坏功能性。 - Winfield Trail
我有不同的观点,但我不想就MySQL的能力与你争辩。但我想指出生活是非常复杂的。虽然一些NoSQL解决方案更适合特定的任务,但公司仍然使用MySQL,只是因为它普及性广。很容易雇用熟悉MySQL的开发人员,并花时间教他们一个全新的数据库(或更多的数据库,用于特定的任务)。我并不是说这样做是好的或更经济的,我只是告诉你我在职业生涯中所经历过的。所以如果他们需要性能,他们会切换/复制到MyISAM。 - Karoly Horvath

3

MyISAM支持全文搜索,同时也支持MERGE表类型。当您拥有一个大表并且希望定期“交换”/归档其中的部分时,这将非常方便。想象一下您想要保留最近的季度和/或年度的日志或报告数据。当您主要进行插入操作且很少更新或删除时,MyISAM可以更好地处理这样的大量数据。

InnoDB性能会在无法将索引放入内存时迅速而明显地下降。如果您的主键不是数字(即自动增量),则可能需要重新考虑使用InnoDB。在InnoDB表上,主键会为每个索引复制。因此,如果您有一个大的主键和几个其他索引,那么您的InnoDB表将非常快速地变得非常大。


1
冒昧像一张破碟片的粉丝唱片,我必须说每当我能做出选择时,我都会选择使用PostgreSQL进行开发。它的表分区实现非常棒。 - Winfield Trail

2

MySQL只为MyISAM实现了一些功能(例如本机全文索引),但是通常情况下,InnoDB对于大多数生产应用程序来说仍然更好。


1
这也是一个有效的方案,尽管在这些情况下使用外部搜索引擎(如lucene、sphinx)可能是更好的解决方案。 - Karoly Horvath

1

此外:mySQL 中的全文搜索仅支持 myISAM 表。


1
MyISAM与InnoDB相比,结构非常简单。它没有行版本控制,每个表只有一个文件,行按顺序存储。虽然它支持并发插入(SELECT和1个INSERT可以同时运行),但它也具有表级锁定(如果在同一表上有2个INSERT,则1个必须等待)。此外,由于数据文件的结构,UPDATE和DELETE很慢。
MyISAM不支持事务或外键。
通常情况下,如果您关注总体趋势(因此不关心单个行的正确性)并且数据在晚上或从不更新,则MyISAM应该更好。此外,它允许通过文件系统将单个表从一个服务器移动到另一个服务器。
InnoDB对并发和事务支持非常好。它对全文搜索有良好的支持,并且对外键具有几乎良好的支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接