8

我的一个项目在 MySQL 中使用了 MyISAM 引擎,但我正在考虑将其更改为 InnoDB,因为我需要在这里和那里的事务支持。

  • 在执行此操作之前,我应该查看或考虑什么?
  • 我可以只更改引擎,还是应该为此准备数据?
4

6 回答 6

8

是的,绝对有很多事情,你应该非常彻底地测试你的应用程序:

  • 事务可能会死锁并且需要重复。即使自动提交的事务只插入一行,情况也是如此(在某些情况下)。
  • 光盘使用量几乎肯定会增加
  • 写入期间的 I/O 负载几乎肯定会增加
  • 由于 InnoDB 使用聚集索引,索引行为将发生变化——这在某些情况下可能是有益的影响
  • 您的备份策略将受到影响。仔细考虑这一点。

迁移过程本身需要仔细计划,因为如果您有大量数据,这将需要很长时间(在此期间数据将是只读的,或者完全不可用 - 请检查!)

于 2008-10-22T10:31:11.353 回答
7

有一个很大的警告。如果您在写入期间遇到任何类型的硬件故障(或类似情况),InnoDB 将损坏表。

MyISAM 也会,但是 mysqlcheck --auto-repair 会修复它们。尝试使用 InnoDB 表将失败。是的,这是来自经验。

这意味着您需要有一个良好的定期数据备份计划才能使用 InnoDB。

于 2009-06-26T16:04:00.583 回答
5

其他一些注意事项:

删除表/数据库或删除记录后,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 很棒,不要让一些陷阱让你灰心。

于 2008-10-23T08:28:30.743 回答
3

只需更改表格并设置引擎就可以了。

  • 需要注意的一个大问题是select count(*) from MyTableInnoDB比 MyISAM 慢得多
  • 在服务器重新启动后,auto_increment 值将重置为表 +1 中的最大值——如果您有一个带有一些删除的凌乱数据库,这可能会导致有趣的问题。
  • 最佳服务器设置将不同于主要的 MyISAM 数据库。
  • 确保 innodb 文件的大小足以容纳您的所有数据,否则当您更改表的引擎时,您将被不断的重新分配所困扰。
于 2008-10-22T15:55:00.267 回答
1

如果您打算使用 InnoDB 作为获取并发查询的一种方式,那么您将需要进行设置innodb_file_trx_commit=1,以便获得一些性能。OTOH,如果您希望重新编码您的应用程序以了解事务,那么决定此设置将成为 InnoDB 设置所需的一般性能审查的一部分。

另一个需要注意的主要事情是 InnoDB 不支持全文索引,也不支持 INSERT DELAYED。但是,MyISAM 不支持参照完整性。:-)

但是,您只能移动需要事务感知的表。我已经做到了。小表(最多几千行)通常可以随时更改,顺便说一句。

于 2008-10-28T05:53:23.933 回答
0

性能特征可能不同,因此您可能需要密切关注负载。

数据会好的。

于 2008-10-22T10:26:17.933 回答