万答#19,MySQL可以禁用MyISAM引擎吗?

随着MySQL8.0的发布,系统表已全面转向InnoDB,MGR亦不支持MyISAM。本文介绍如何通过设置disabled_storage_engines来禁用MyISAM引擎,并讨论其对mysql_upgrade的影响。
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

MyISAM的适用场景越来越少了。

随着MySQL 8.0的推出,系统表已经全面采用InnoDB引擎,不再需要MyISAM引擎。另外,MGR中也不支持MyISAM引擎。

因此,基本上可以考虑全面禁止使用MyISAM引擎了,问题是,这可行吗?

答案是肯定的,可以做到。

从MySSQL 5.7.8开始,新增一个选项 disabled_storage_engines,只需要设置下即可:

disabled_storage_engines = MyISAM

这就完美地实现禁用MyISAM的目的了。

另外,这么设置的话,是不会影响MySQL实例初始化的。即便是在MySQL 5.7版本中,系统表要使用MyISAM引擎,也不会影响生成MyISAM引擎的系统表。

disabled_storage_engines is disabled and has no effect if the server is started with any of these options: --bootstrap, --initialize, --initialize-insecure, --skip-grant-tables.

不过,设置该选项后可能会影响 mysql_upgrade 升级:

Setting disabled_storage_engines might cause an issue with mysql_upgrade. For details, see Section 4.4.7, “mysql_upgrade — Check and Upgrade MySQL Tables”.

执行 mysql_upgrade 进行升级时可能会报错:

mysql_upgrade: [ERROR] 3161: Storage engine MyISAM is disabled
(Table creation is disallowed).

这时候需要临时关闭该选项,等待升级完成后再重新启用即可。

Enjoy GreatSQL :)

本文由博客一文多发平台 OpenWrite 发布!

MySQL 的 `Temptable` 临时表引擎是在 MySQL 8.0 中引入的,旨在提供比 `MEMORY` 引擎更高的性能更灵活的存储能力。它将临时表数据存储在内存中,但使用固定行格式,这在某些查询场景中可以显著提升性能[^2]。然而,尽管其设计目标是优化临时表处理,但在实际使用过程中仍然存在一些已知的问题 bug。 ### 已知问题BUG 1. **不支持 BLOB TEXT 类型字段** 在某些版本中,使用 `Temptable` 作为临时表引擎时,如果查询涉及 `BLOB` 或 `TEXT` 类型的字段,可能会导致错误或临时表无法正确创建。这是因为 `Temptable` 引擎默认不支持变长字段类型。解决方法是强制 MySQL 使用 `MyISAM` 或 `InnoDB` 作为临时表引擎,可以通过设置 `temptable_use_mmap=OFF` 来禁用内存映射并回退到磁盘临时表。 2. **排序性能下降问题** 在涉及大量排序操作的查询中,`Temptable` 引擎的性能可能不如预期。由于其行格式固定,无法有效压缩数据,导致在 `sort_buffer` 中处理的数据量较大,进而影响整体排序效率。在某些场景下,使用 `MEMORY` 引擎反而能获得更好的性能表现[^2]。 3. **临时表内存使用过高** `Temptable` 引擎在处理大容量临时表时,可能消耗过多的内存资源,尤其是在并发查询较多的情况下。这可能导致内存不足(OOM)错误或系统性能下降。可以通过调整 `temptable_max_ram` 系统变量来限制 `Temptable` 引擎使用的最大内存,超出该限制后会自动将数据写入磁盘临时表。 4. **与某些 SQL 函数操作不兼容** 某些 SQL 函数(如 `GROUP_CONCAT`)或操作(如 `DISTINCT` 与 `ORDER BY` 混合使用)在与 `Temptable` 引擎结合时可能出现意外行为。例如,在某些版本中,当 `GROUP_CONCAT` 操作需要创建临时表时,`Temptable` 可能无法正确处理字段长度限制,导致截断或错误。解决办法是通过设置 `optimizer_switch='prefer_ordering_index=off'` 来避免使用 `Temptable` 引擎[^2]。 5. **BUG #99165:临时表元数据锁问题** 在 MySQL 8.0.19 到 8.0.21 版本中,存在一个与临时表元数据锁(MDL)相关的 bug,当多个会话同时使用 `Temptable` 引擎创建临时表时,可能会出现死锁或锁等待超时的情况。该问题在后续版本中已修复,建议升级到 MySQL 8.0.22 或更高版本[^1]。 ### 解决方案与建议 - **监控临时表使用情况**:通过 `information_schema` 或性能模式(Performance Schema)监控临时表的创建与使用情况,及时发现潜在问题。 - **调整系统变量**:合理配置 `temptable_max_ram`、`temptable_use_mmap` 等系统变量,以平衡内存使用与性能需求。 - **版本升级**:确保使用的是最新稳定版本的 MySQL,以避免已知的 bug 问题。 - **回退到传统引擎**:在某些复杂查询场景下,可以通过设置 `internal_tmp_mem_storage_engine=MEMORY` 强制 MySQL 使用 `MEMORY` 引擎创建临时表,尽管这可能牺牲部分性能,但能避免 `Temptable` 的兼容性问题[^2]。 ```sql -- 示例:强制使用 MEMORY 引擎创建临时表 SET GLOBAL internal_tmp_mem_storage_engine = 'MEMORY'; ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值