gpt4 book ai didi

mysql - MySQL 5.7中MyISAM和InnoDB存储引擎之间的当前差异是什么?

转载 作者:可可西里 更新时间:2023-11-01 07:47:07 25 4
gpt4 key购买 nike

我在stackoverflow上看到了很多关于myisam vs innodb的问题和答案。
但是,所有的问题和答案都太老了,与mysql 5.7.x的当前稳定版本无关
到目前为止,myisam和innodb都必须做很多开发工作。
所以,我需要5.7.x版目前提供的这些差异
所以,请不要重复标记我的问题,有人请解释这些存储引擎目前的差异,以及他们过去的差异。
另外,请解释在什么情况下应该为表选择哪种存储引擎。
属于同一架构的不同表是否有不同的存储引擎,即少数表有innodb,少数表有myisam。
如果是,那么如何在带有myisam和innodb的表之间执行连接查询?
mysql真的要从将来的版本中删除myisam存储引擎吗?

最佳答案

你认为Myisam得到了新的发展是不正确的。Myisam没有得到任何重大的新发展。mysql显然正朝着逐步淘汰myisam的方向发展,因此不鼓励使用myisam。
甲骨文公司尚未宣布任何具体日期或版本,他们将删除MyISAM。我的猜测是MyISAM永远不会被完全删除,因为有太多的网站无法升级,而没有进行昂贵的测试,以确保他们的特定应用程序不会经历任何回归问题转换到InnoDB。
但您可能会注意到,在mysql 5.7手册中,myisam的部分已经降级为Alternative Storage Engines,这应该是它获得的优先级较低的一个线索。
在mysql 5.7中,myisam仍然用于一些系统表,如mysql.usermysql.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 indexesspatial indexes。这些特性并不是像以前那样继续使用myisam的原因。
逻辑备份工具(如mysqldump和物理备份工具(如percona xtrabackup)都无法在不获取全局锁的情况下备份myisam表。
您询问是否可以在同一架构中创建具有不同存储引擎的各种表。是的,你可以,这和很多版本的mysql一样。
您询问是否可以联接不同存储引擎的表(顺便说一下,要联接表,表不需要在同一架构中)。是的,你可以加入这样的表,mysql负责所有的细节。这和很多版本的mysql一样。
但是当你这样做的时候会出现一些奇怪的情况,比如你在事务中更新myisam表和innodb表,然后回滚呢?innodb表中的更改将回滚,但myisam表中的更改不会回滚,因此如果不小心,您的数据完整性可能会被破坏。这也和很多版本的mysql一样。
与innodb相比,myisam有优势的例子很短,而且越来越短。
在myisam中,一些表扫描查询和大容量插入更快。innodb更擅长索引搜索。
myisam可能比未压缩的innodb表中存储的等效数据占用更少的存储空间。您可以使用myisampack进一步压缩myisam表,但这会使myisam表成为只读的。
如今,在事务性存储引擎中还有其他的数据压缩存储选项,例如InnoDB table compressionMyRocks
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

关于mysql - MySQL 5.7中MyISAM和InnoDB存储引擎之间的当前差异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com