当前位置:  开发笔记 > 后端 > 正文

从MyISAM更改为InnoDB时,您是否需要了解任何陷阱/事项?

如何解决《从MyISAM更改为InnoDB时,您是否需要了解任何陷阱/事项?》经验,为你挑选了3个好方法。

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

在做这个之前我应该​​看什么或考虑什么?

我可以只更改引擎,还是应该为它准备好数据?

MarkR.. 8

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

事务可能会死锁,需要重复.即使使用仅插入一行的自动提交事务,情况也是如此(在某些情况下).

光盘使用几乎肯定会增加

写入期间的I/O负载几乎肯定会增加

索引的行为将发生变化,因为InnoDB使用聚簇索引 - 这在某些情况下可能会产生有益效果

您的备份策略将受到影响.仔细考虑这一点.

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



1> MarkR..:

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

事务可能会死锁,需要重复.即使使用仅插入一行的自动提交事务,情况也是如此(在某些情况下).

光盘使用几乎肯定会增加

写入期间的I/O负载几乎肯定会增加

索引的行为将发生变化,因为InnoDB使用聚簇索引 - 这在某些情况下可能会产生有益效果

您的备份策略将受到影响.仔细考虑这一点.

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



2> Jeff Davis..:

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

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

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



3> 小智..:

其他一些说明:

删除表/数据库或删除记录后,InnoDB不会在文件系统上重新分配可用空间,这可以通过"转储和导入"或innodb_file_per_table=1my.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很棒,不要让一些陷阱劝阻你.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有