代码之家  ›  专栏  ›  技术社区  ›  Jrgns

当从myisam更改为innodb时,您是否需要了解任何陷阱/事情?

  •  8
  • Jrgns  · 技术社区  · 16 年前

    我的一个项目在mysql中使用了myisam引擎,但是我正在考虑将它改为innodb,因为我需要在这里和那里提供事务支持。

    • 在这样做之前,我应该看什么或考虑什么?
    • 我可以只更改引擎,还是应该为它准备数据?
    6 回复  |  直到 15 年前
        1
  •  8
  •   MarkR    16 年前

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

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

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

        2
  •  7
  •   Jeff Davis    15 年前

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

    myisam也会,但mysqlcheck——自动修复会修复它们。使用innodb表尝试此操作将失败。是的,这是经验。

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

        3
  •  5
  •   Laurynas PečiÅ«ra    16 年前

    其他注意事项:

    在删除表/数据库或删除记录后,InnoDB不会重新分配文件系统上的可用空间,这可以通过“转储和导入”或设置来解决。 innodb_file_per_table=1 在M.CNF。

    在一个大型innodb表上添加/删除索引会非常痛苦,因为它会锁定当前表,用更改的索引创建一个临时表,并逐行插入数据。有一个 plugin from Innobase 但是它只适用于MySQL5.1

    InnoDB的内存也要大得多,我建议你有同样大的 innodb_buffer_pool_size 服务器内存允许的变量(70-80%应该是安全的)。如果您的服务器是unix/linux,请考虑减少sysctl变量 vm.swappiness 0和使用 innodb_flush_method=O_DIRECT 避免双重缓冲。切换这些值时,始终测试是否单击交换。您可以随时在 Percona blog 太好了。

    另外,你也可以跑步 mysqlbackup 具有 --single-transaction --skip-lock-tables 并且在开始备份时没有表锁。

    在任何情况下,InnoDB都是伟大的,不要让一些陷阱使你泄气。

        4
  •  3
  •   J.D. Fitz.Gerald    16 年前

    只需改变桌子和设置引擎就可以了。

    • 要注意的一个大问题是 select count(*) from MyTable 许多的 innodb比myisam慢。
    • 服务器重新启动后,auto_increment值将重置为表+1中的最高值——如果数据库中有一些删除,这可能会导致有趣的问题。
    • 最佳服务器设置将不同于主要的myisam数据库。
    • 确保innodb文件的大小足以容纳所有的数据,否则在更改表的引擎时,您将被不断重新分配所钉死。
        5
  •  1
  •   staticsan    16 年前

    如果您打算使用innodb作为获取并发查询的方法,那么您需要设置 innodb_file_trx_commit=1 所以你得到了一些表现。Otoh,如果您希望重新编码应用程序以了解事务,那么决定此设置将是InnoDB设置所需的常规性能检查的一部分。

    另一个需要注意的主要问题是InnoDB不支持全文索引,也不支持延迟插入。但是,Myisam不支持引用完整性。-)

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

        6
  •  0
  •   Greg    16 年前

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

    数据会很好的。