【问题标题】:Are there any pitfalls / things you need to know when changing from MyISAM to InnoDB从 MyISAM 更改为 InnoDB 时是否有任何陷阱/需要知道的事情
【发布时间】:2010-09-18 12:24:33
【问题描述】:

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

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

【问题讨论】:

    标签: mysql innodb myisam change-management


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 更准确的说法是 Innodb 不会接受损坏的数据。
      【解决方案3】:

      其他一些注意事项:

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

      【讨论】:

        【解决方案4】:

        只要改变表格和设置引擎就可以了。

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 您应该将 innodb_file_trx_commit 设置为 0 或 2,而不是 1。
          • 我的错,是的,如果您来自 MyISAM 并使用无交易代码的推荐设置。
          【解决方案6】:

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

          数据会好的。

          【讨论】:

            猜你喜欢
            • 2010-12-16
            • 1970-01-01
            • 2011-12-28
            • 2011-10-14
            • 2014-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            相关资源
            最近更新 更多