我在stackoverflow本身上看到了很多关于 MyISAM vs InnoDB 主题的问题和答案。
但是,所有问题和答案都太旧了,与当前稳定版 MySQL 5.7.x无关
到目前为止,必须在 MyISAM 和 InnoDB 中进行大量开发。
因此,我需要目前版本 5.7.x
的差异所以,请不要将我的问题标记为重复,有人请解释这些存储引擎目前存在的差异以及它们之后的差异。
另外,请说明应该选择哪种存储引擎用于表格。
属于同一架构的不同表是否具有不同的存储引擎,即少数表将具有 InnoDB ,而少数表将具有 MyISAM 。
如果是,那么如何在 MyISAM 和 InnoDB 的表之间执行 JOIN 查询?
MySQL 是否会从未来版本中删除 MyISAM 存储引擎?
答案 0 :(得分:9)
您对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 versus InnoDB的回答。
MyISAM仍然不支持外键,因为它的价值。但即使使用InnoDB,我也很少看到使用外键的真实制作网站。
MyISAM仅支持表级锁定(除了附加到表末尾的一些INSERT,如手册中所述)。
MySQL 5.7支持MyISAM和InnoDB中的fulltext indexes和spatial indexes。这些功能不是继续使用MyISAM的原因。
像mysqldump
这样的逻辑备份工具和Percona XtraBackup等物理备份工具都无法在不获取全局锁定的情况下备份MyISAM表。
您询问是否可以在同一架构中创建具有不同存储引擎的各种表。是的,你可以,这与许多MySQL版本一样。
您询问是否可以加入不同存储引擎的表(顺便说一下,表格不需要在同一个模式中加入)。是的,你可以加入这样的表,MySQL负责所有的细节。这与许多MySQL版本相同。
但是当你这样做时会出现一些奇怪的情况,就像你在事务中更新MyISAM表和InnoDB表然后回滚一样?将回滚InnoDB表中的更改,但MyISAM表中的更改不会回滚,因此如果您不小心,可能会破坏数据完整性。这也与许多MySQL版本一样。
MyISAM优于InnoDB的优势是一个简短的列表,而且它越来越短。
MyISAM中的某些表扫描查询和批量插入更快。 InnoDB在索引搜索方面更胜一筹。
MyISAM可以使用比未压缩 InnoDB表中存储的等效数据更少的存储空间。您可以使用myisampack进一步压缩MyISAM表,但这会使MyISAM表成为只读。
目前,还有其他选项可用于在事务存储引擎中紧凑存储数据,例如InnoDB table compression或MyRocks。
SELECT COUNT(*) FROM MyTable
查询(没有WHERE子句)在MyISAM中非常快,因为在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表执行类似操作,但必须使用transportable tablespaces的复杂功能。但是,由于新的数据字典功能,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
答案 1 :(得分:1)
我有一个关于工作测验的问题并且做对了:(参考新版本):
MyISAM和InnoDB是两种不同的存储引擎,可以不同方式处理CRUD操作。
锁定:当在MyISAM存储工程中对行进行处理时,所有表都将被其他会话锁定,直到提交更改,这与InnoDB不同,后者仅锁定特定的选定行(/ s)。锁定被释放,直到会话被提交。锁定表或行会导致尝试与同一表或行交互的其他会话暂停,以防止表中的错误数据操作。
交易:与MyISAM不同,InnoDB支持交易。事务是对SELECT,INSERT,UPDATE和DELETE等2个或更多命令的集合,直到完成一个操作。
原子操作:在InnoDB中设置事务时 操作未完成 - 它终止所有的更改和 按原样恢复数据库(全部或者没有#39;),例如,如果在 在事务中间代码中存在语法错误/ 数据类型不匹配或任何可能中断捆绑的东西 用于完成其操作的命令 - 不会应用所有更改, 谢谢交易atomicy。另一方面,使用时 MyISAM存储引擎,如果一捆命令"中断" (任何 原因),操作立即停止和所有 受影响的表/行/数据将继续受到影响 可能会导致数据库中的数据损坏(......而且很头疼)。
B中。在MyISAM上运行操作是在现场设置的, 而InnoDB允许你使用" ROLLBACK" s来丢弃任何 改变,在运行交易时最方便。
事务日志:创建没有的事务时 事务登录之间,您可以对表应用任何更改 在DB中,如果表有聚簇索引(例如), 数据必须搜索确切地插入的位置和 然后才应用更改。在有交易的情况下 在数据库和事务之间登录,将发送更改 首先到事务日志,然后在表中设置它的顺序 在将更改发送到数据库之前 - 这将花费更少的时间 耗时。 DB保存来自所有事务的日志 制作,这可以帮助选择以前恢复任何交易 制作并恢复所有更改。当设置为"简单"恢复模型 - 事务从事务日志中删除,并且无法恢复数据(通常在DEV环境中使用)。设置为时 "全"恢复模型,所有交易都保存并列出,准备就绪 要恢复 - 这通常用于生产环境 这可能会导致性能问题 - 所以支持他们 向上和从服务器删除可能是一个解决方案。设置为a时 "大容量日志"恢复模型仅保存事务日志 具体"重要"变更和命令(导入,导出, insert-select,select-into,reorganaizing / rebuilding index)和 可能会阻止性能问题。
外键:与InnoDB不同,MyISAM dos不使用外键。当表列的foregin键设置为指向另一个表列时,如果在指向的表上发生任何更新/删除,它将知道必须在指向它的另一个表上应用更改。这会在两个表之间创建某种链接并使数据保持同步。使用FK设置表可能需要更多努力,这可能被视为缺点(?)。
FULLTEXT索引:InnoDB在以前的版本中不支持FULLTEXT索引--MyISAM支持它。切换到MyISAM不是最好的解决方案,所以只需将MySQL更新为支持FULLTEXT索引的版本。 FULLTEXT索引可以采用标题,评论,等等文本。 - 并搜索它(在这种情况下,这应该比" LIKE"命令更好)。
空间数据类型:仅在InnoDB上支持。
总而言之,InnoDB在数据处理,有效性和数据处理方面通常更可靠。复苏。对于较新版本,InnoDB将支持主要搜索的FULLTEXT索引 - 当使用没有更新MySQL选项的旧版本时,使用MyISAM将非常棒。