何时使用MyISAM和InnoDB?

139

MyISAM的设计理念是假设您的数据库查询操作比更新操作要频繁得多,因此它执行非常快速的读取操作。如果您的读写(插入|更新)比率低于15%,那么最好使用MyISAM。

InnoDB使用行级锁定,具有提交、回滚和崩溃恢复功能,以保护用户数据。它支持事务和容错性。

上述是MyISAM和InnoDB之间的正确区别吗?如果MyISAM或InnoDB存在其他限制,应该在什么情况下使用MyISAM或InnoDB?谢谢!


4
有几种情况。1. 如果您想使用全文搜索,则请使用MYISAM。2. 如果您想在表中使用关系约束,请使用INNODB。 - Dieepak
3
为什么不看一下右侧列称为“相关”的内容? - Your Common Sense
1
为什么要点赞这个明显重复且即将关闭的问题呢? - Your Common Sense
4
MySQL 5.6也支持InnoDB的全文搜索功能。 - Michiel van Vaardegem
1
现在Innodb非常出色,与Myisam相比性能也更好。我已经在2017年将我的引擎从MyISAM改为INNODB,并且它正在积极开发中。 - Ajmal PraveeN
显示剩余4条评论
2个回答

240

阅读有关 存储引擎 的资料。

MyISAM:

MySQL中的 MyISAM 存储引擎。

  • 设计和创建更简单,因此适合初学者。不必担心表与表之间的外部关系。
  • 整体上比InnoDB更快,因为结构更简单,因此服务器资源成本更低。 --现在大多数情况下不再是真的。
  • 全文索引。-- InnoDB现在也有了
  • 特别适用于读密集型(select)表。--现在大多数情况下不再是真的。
  • 磁盘占用比InnoDB低2倍至3倍。 -- 自5.7版本以来,这可能是MyISAM唯一的真实优势。

InnoDB:

MySQL中的InnoDB 存储引擎。

  • 支持事务(提供对 ACID 属性的支持)。
  • 行级锁定。具有更细粒度的锁定机制,与例如MyISAM相比,可以获得更高的并发性。
  • 外键约束。使您能够让数据库确保数据库状态及表之间的关系完整性。
  • InnoDB比MyISAM更耐受表损坏。
  • 支持大型数据和索引缓冲池。 MyISAM键缓冲仅适用于索引。
  • MyISAM已经停滞不前;未来的所有增强功能都将在InnoDB中进行。随着8.0版本的推出,这一点变得非常明显。
  • MyISAM限制:

    • 没有外键和级联删除/更新
    • 没有事务完整性(ACID兼容性)
    • 没有回滚能力
    • 4,284,867,296行限制(2^32)--这是旧的默认值。可配置的限制(对于许多版本)为2**56字节。
    • 每个表最多64个索引

    InnoDB限制:

    • 没有全文索引(5.6以下mysql版本)
    • 不能压缩以进行快速只读(5.5.14引入了ROW_FORMAT=COMPRESSED
    • 无法修复InnoDB表

    简要理解请阅读下面链接:

    1. MySQL引擎:InnoDB vs. MyISAM - 优缺点比较
    2. MySQL引擎:MyISAM vs. InnoDB
    3. InnoDB和MyISAM之间的主要区别是什么?
    4. MyISAM与InnoDB
    5. MyISAM和InnoDB之间有什么区别?
  • MySQL:MyISAM vs. InnoDB!

  • 13
    MySQL 5.6中,InnoDB引擎支持全文索引。 - Argeman
    你没有列出 MyISAM 的好处。 - Perception
    1
    @Perception 添加 MyISAM 描述和以下链接中的所有内容。 - Tony Stark
    有关从MyISAM转换为InnoDB,请参见myisam2innodb博客 - Rick James
    在MySQL 5.7中,InnoDB表最多只能有64个索引的限制。 - VCD
    显示剩余2条评论

    20

    如果数据不是很重要或者确实需要最小的性能优势,可以使用MyISAM。但并非在所有情况下MyISAM的读取性能都更好。

    我个人不会再使用MyISAM了。选择InnoDB并增加一些硬件来提高性能。另一个想法是查看具有更多功能的数据库系统,如适用的PostgreSQL。

    编辑:关于读取性能,此链接显示InnoDB通常实际上比MyISAM慢: https://www.percona.com/blog/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/


    7
    在使用现代日志文件系统时,“将MyISAM用于非常不重要的数据”过分强调了可靠性差异。而且更普遍的观点通常认为MyISAM在读取方面更快。我无法弄清楚Percona博客的结果为什么是个例外。我们对自己的表格使用两种引擎进行了实验,发现MyISAM读取通常比InnoDB快近一倍。最好在可能的情况下使用自己的实际数据和环境进行测试。 - orrd
    @orrd 你说得对,只有使用自己的数据进行测试才能展示性能影响。我的实验表明,在大多数只读情况下几乎没有任何区别,但当写操作经常发生时,MyISAM往往会遇到真正的问题,因此在我目前所遇到的所有用例中,InnoDB都要好得多。 - Argeman
    7
    这篇博客文章的链接现在已经有大约10年的历史了。 - robsch
    不仅仅是提高两倍的速度,在我们的测试中,我们在查找方面实现了80倍的加速,遗憾的是它并没有为写入密集型应用程序进行改进。 - Jones G

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