4

我在 stackoverflow上看到了很多关于MyISAM vs InnoDB这个主题的问题和答案。

但是,所有的问题和答案都太老了,与当前稳定的MySQL 5.7.x版本无关

到那时,必须在MyISAMInnoDB中都进行了如此多的开发。

所以,我需要那些目前在5.7.x版本中可用的差异

因此,请不要将我的问题标记为重复,请有人解释这些存储引擎当前的差异以及它们自过去以来的差异。

另外,请说明在什么情况下应该为表选择哪种存储引擎。

属于同一模式的不同表是否可以具有不同的存储引擎,即很少有表具有InnoDB而很少有表具有MyISAM

如果是,那么JOIN查询将如何在MyISAMInnoDB表之间执行?

MySQL是否真的要从未来的版本中删除MyISAM存储引擎?

4

2 回答 2

15

您认为 MyISAM 一直在接受新开发的假设是不正确的。MyISAM 没有收到任何重大的新发展。MySQL 显然正朝着逐步淘汰 MyISAM 的方向发展,不鼓励使用 MyISAM。

甲骨文公司尚未宣布他们将删除 MyISAM 的任何具体日期或版本。我的猜测是 MyISAM 永远不会被完全删除,因为有太多的网站无法升级,没有进行昂贵的测试以确保他们的特定应用程序不会通过转换为 InnoDB 遇到任何回归问题。

但是您可能会注意到,在 MySQL 5.7 手册中,有关 MyISAM 的部分已降级为Alternative Storage Engines,这应该表明它的优先级较低。

在 MySQL 5.7 中,MyISAM 仍然用于一些系统表,如mysql.user,mysql.db等。但是 5.6 和 5.7 中引入的新系统表是 InnoDB。MySQL 8.0 中的所有系统表都是 InnoDB。

MyISAM 仍然不支持ACID的任何属性。没有事务,没有一致性特性,也没有持久写入。请参阅我对MyISAM 与 InnoDB的回答。

MyISAM 仍然不支持外键,因为它的价值。但即使使用 InnoDB,我也很少看到使用外键的真实生产站点。

MyISAM 仅支持表级锁定(除了一些附加到表末尾的 INSERT,如手册中所述)。

MySQL 5.7 支持MyISAM 和 InnoDB 中的全文索引空间索引。这些功能不再是像以前那样继续使用 MyISAM 的理由。

像 Percona XtraBackup 这样的逻辑备份工具mysqldump和像 Percona XtraBackup 这样的物理备份工具都无法在没有获取全局锁的情况下备份 MyISAM 表。

您问是否可以在同一架构中创建具有不同存储引擎的各种表。是的,你可以,这与许多版本的 MySQL 相同。

您问是否可以连接不同存储引擎的表(顺便说一下,表不需要在相同的模式中进行连接)。是的,你可以加入这样的表,MySQL 会处理所有的细节。这与许多版本的 MySQL 相同。

但是当你这样做时会出现一些奇怪的情况,比如如果你在一个事务中更新一个 MyISAM 表和一个 InnoDB 表,然后回滚呢?InnoDB 表中的更改会回滚,但 MyISAM 表中的更改不会回滚,因此如果您不小心,可能会破坏您的数据完整性。这也与许多版本的 MySQL 相同。

MyISAM 比 InnoDB 有优势的案例是一个简短的列表,而且它越来越短。

  • 在 MyISAM 中,一些表扫描查询和批量插入更快。InnoDB 更擅长索引搜索。

  • 与存储在未压缩InnoDB 表中的等效数据相比,MyISAM 可能使用更少的存储空间。您可以使用myisampack进一步压缩 MyISAM 表,但这会使 MyISAM 表成为只读的。

    如今,还有其他选项可以在事务存储引擎中紧凑地存储数据,例如InnoDB 表压缩MyRocks

  • SELECT COUNT(*) FROM MyTableMyISAM 中的查询(没有 WHERE 子句)非常快,因为准确的行数保留在 MyISAM 元数据中。InnoDB(或其他 MVCC 实现)不会保留此计数,因为查看表的每个事务都可能“看到”不同的行计数。只有像 MyISAM 这样具有表级锁定且没有事务隔离的存储引擎才能优化这种情况。

  • 为另一个键列中的每个不同值自动递增该数字。同样,这需要表级锁定,因此 InnoDB 不支持它。

    CREATE TABLE MyTable (
      group_id INT NOT NULL,
      seq_id INT NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (group_id, seq_id)
    ) ENGINE=MyISAM;
    
  • 将 MyISAM 表从服务器移动到服务器仍然很容易,因为 .MYD 和 .MYI 文件是独立的。你可以对 InnoDB 表做一些类似的事情,但你必须使用可传输表空间的复杂特性。但是 MyISAM 的这种易于移动的表质量不再适用于 MySQL 8.0,因为它们具有新的数据字典功能。

  • 在某些负载下,MyISAM 可能是更好的选择internal_tmp_disk_storage_engine,在 MySQL 5.7 中默认为 InnoDB。如果您运行大量在磁盘上创建临时表的查询(内存中的临时表不会受益),它可能会给 InnoDB 引擎带来压力。但是你必须有一个很高的查询率才能做到这一点,如果你的查询在磁盘上创建了这么多临时表,你应该尝试以不同的方式优化查询。

  • MyISAM 允许您设置多个键缓存,并为特定表定义缓存。但是 MyISAM 键缓存仅用于索引结构,而不用于数据。

参考:

https://www.percona.com/blog/2016/10/11/mysql-8-0-end-myisam/

https://www.percona.com/blog/2017/12/04/internal-temporary-tables-mysql-5-7/

http://jfg-mysql.blogspot.com/2017/08/why-we-still-need-myisam.html

于 2017-12-06T18:32:58.593 回答
2

我有一个工作测验的问题并且做对了:(参考新版本):

MyISAM 和 InnoDB 是两种不同的存储引擎,它们以不同的方式处理 CRUD 操作。

  • 锁定:当接近 MyISAM 存储引擎中的一行时,所有表将被其他会话锁定,直到提交更改,这与 InnoDB 不同,它只锁定特定的选定行(/s)。锁被释放,直到会话被提交。锁定表或行会导致尝试与同一表或行交互的其他会话暂停,以防止表中的错误数据操作。

  • 事务:与 MyISAM 不同,InnoDB 支持事务。事务是 2 个或多个命令(如 SELECT、INSERT、UPDATE 和 DELETE)的集合,直到完成为止。

    1. 原子操作:当在 InnoDB 中设置事务并且操作未完成时 - 它终止所有更改并恢复数据库原样(全部或全部),例如,如果在事务中间有语法代码错误/数据类型不匹配或任何可能中断命令包以完成其操作的错误 - 所有更改都不会应用,感谢事务原子性。另一方面,当使用 MyISAM 存储引擎时,如果一组命令“中断”(出于任何原因),操作会立即停止,并且所有受影响的表/行/数据仍将受到影响,这可能会导致损坏数据库中的数据(......和头痛)。

    2. B. 在 MyISAM 上运行操作是现场设置的,而 InnoDB 允许您使用“ROLLBACK”来丢弃任何更改,这在运行事务时最方便。

    3. 事务日志:当创建一个没有事务日志的事务时,您可以对数据库中的表应用任何更改,如果表有聚集索引(例如),数据将不得不搜索它的确切位置必须插入,然后才应用更改。在数据库和事务之间存在事务日志的情况下,更改将首先发送到事务日志,并在将更改发送到数据库之前在表中设置其顺序 - 这将减少耗时。数据库保存所有已进行事务的日志,这有助于选择恢复以前进行的任何事务,并恢复所有更改。当设置为“简单”恢复模式时,事务会从事务日志中删除,并且无法恢复数据(通常在 DEV 环境中使用)。当设置为“完整”恢复模式时,所有事务都被保存并列出,准备恢复 - 这通常用于可能导致性能问题等问题的生产环境 - 因此备份它们并从服务器中删除可能是一种解决方案。当设置为“批量记录”恢复模式时,仅为特定“重要”更改和命令(导入、导出、插入选择、选择、重组/重建索引)保存事务日志,并可能防止性能问题。

  • 外键:与 InnoDB 不同,MyISAM 不使用外键。当一个表列的外键设置为指向另一个表列时,当指向的表上发生任何更新/删除时,它将知道必须将更改应用于指向它的另一个表。这会在两个表之间创建某种链接并保持数据同步。使用 FK 设置表可能需要更多的努力,这可能被认为是一个缺点 (?)。

  • FULLTEXT 索引:InnoDB 在其以前的版本中不支持 FULLTEXT 索引 - MyISAM 确实支持它。切换到 MyISAM 不会是最好的解决方案,所以只需将 MySQL 更新到支持 FULLTEXT 索引的版本。FULLTEXT 索引可以获取标题、评论等文本并对其进行搜索(在这种情况下,这应该是比“LIKE”命令更好的选择)。

  • 空间数据类型:仅在 InnoDB 上支持。

总而言之,InnoDB 在数据处理、有效性和恢复方面通常会更可靠。对于较新的版本,InnoDB 将支持主要搜索的 FULLTEXT 索引 - 当使用旧版本而没有更新 MySQL 的选项时,使用 MyISAM 会很棒。

于 2018-01-17T13:45:35.997 回答