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