您认为 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 MyTable
MyISAM 中的查询(没有 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