我的一个项目在 MySQL 中使用了 MyISAM 引擎,但我正在考虑将其更改为 InnoDB,因为我需要在这里和那里的事务支持。
- 在执行此操作之前,我应该查看或考虑什么?
- 我可以只更改引擎,还是应该为此准备数据?
我的一个项目在 MySQL 中使用了 MyISAM 引擎,但我正在考虑将其更改为 InnoDB,因为我需要在这里和那里的事务支持。
是的,绝对有很多事情,你应该非常彻底地测试你的应用程序:
迁移过程本身需要仔细计划,因为如果您有大量数据,这将需要很长时间(在此期间数据将是只读的,或者完全不可用 - 请检查!)
有一个很大的警告。如果您在写入期间遇到任何类型的硬件故障(或类似情况),InnoDB 将损坏表。
MyISAM 也会,但是 mysqlcheck --auto-repair 会修复它们。尝试使用 InnoDB 表将失败。是的,这是来自经验。
这意味着您需要有一个良好的定期数据备份计划才能使用 InnoDB。
其他一些注意事项:
删除表/数据库或删除记录后,InnoDB 不会重新分配文件系统上的可用空间,这可以通过“转储和导入”或innodb_file_per_table=1
在 my.cnf 中设置来解决。
在大型 InnoDB 表上添加/删除索引可能会非常痛苦,因为它会锁定当前表,使用您更改的索引创建一个临时表并逐行插入数据。Innobase有一个插件,但它仅适用于 MySQL 5.1
InnoDB 也有更多的内存密集型,我建议您在innodb_buffer_pool_size
服务器内存允许的范围内拥有尽可能大的变量(70-80% 应该是一个安全的赌注)。如果您的服务器是 UNIX/Linux,请考虑将 sysctl 变量减少vm.swappiness
到 0 并使用innodb_flush_method=O_DIRECT
以避免双重缓冲。在切换这些值时,请务必测试是否点击了交换。您可以随时在Percona 博客上阅读更多内容,这很棒。
此外,您可以在备份开始时mysqlbackup
使用--single-transaction --skip-lock-tables
并且没有表锁来运行。
无论如何,InnoDB 很棒,不要让一些陷阱让你灰心。
只需更改表格并设置引擎就可以了。
select count(*) from MyTable
InnoDB比 MyISAM 慢得多。如果您打算使用 InnoDB 作为获取并发查询的一种方式,那么您将需要进行设置innodb_file_trx_commit=1
,以便获得一些性能。OTOH,如果您希望重新编码您的应用程序以了解事务,那么决定此设置将成为 InnoDB 设置所需的一般性能审查的一部分。
另一个需要注意的主要事情是 InnoDB 不支持全文索引,也不支持 INSERT DELAYED。但是,MyISAM 不支持参照完整性。:-)
但是,您只能移动需要事务感知的表。我已经做到了。小表(最多几千行)通常可以随时更改,顺便说一句。
性能特征可能不同,因此您可能需要密切关注负载。
数据会好的。