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

4 mysql myisam innodb storage-engines mysql-5.7

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

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

MyISAMInnoDB都必须进行大量开发时.

因此,我需要目前版本为5.7.x的差异

所以,请不要将我的问题标记为重复,有人请解释这些存储引擎目前存在的差异以及它们之后的差异.

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

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

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

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

Bil*_*win 12

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

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

但您可能会注意到,在MySQL 5.7手册中,MyISAM上的部分已被降级为备用存储引擎,这应该是它获得较少优先级的线索.

在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的原因.

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

您询问是否可以在同一模式中创建具有不同存储引擎的各种表.是的,你可以,这与许多MySQL版本一样.

您询问是否可以连接不同存储引擎的表(顺便说一句,表不需要在同一个模式中加入).是的,你可以加入这样的表,MySQL负责所有的细节.这与许多MySQL版本相同.

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

MyISAM比InnoDB有优势的情况是一个简短的列表,而且它越来越短.

  • MyISAM中的一些表扫描查询和批量插入更快.InnoDB在索引搜索方面更胜一筹.

  • MyISAM可以使用比存储在未压缩的 InnoDB表中的等效数据更少的存储空间.您可以使用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;
    
    Run Code Online (Sandbox Code Playgroud)
  • 将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