从MyISAM转换为InnoDB有任何麻烦吗?


11

我已经准备好从MyISAM迁移到InnoDB,但想知道是否有要查找的完整列表?例如,我没有看到任何列表提到DISABLE KEYS在InnoDB表上运行会抛出警告,除了的手册页ALTER TABLE。在转换之前,我需要了解这种事情。我以为我可以查询很好,但显然不行。

Answers:


7

这是一些陷阱

内存使用情况

我的ISAM

创新数据库

  • 缓存数据页和索引页。
  • MySQL 5.5之前的一种缓冲池和一种尺寸
  • 从MySQL 5.5开始的1个或更多缓冲池

这是我之前写和发布的一些查询,这些查询如何为MyISAM密钥缓存和InnoDB缓冲池选择合适的大小

全文索引

我的ISAM

  • 支持FULLTEXT索引

创新数据库

  • 从MySQL 5.6开始,是的,但仍处于beta(更新:MySQL 5.6存在并且具有FULLTEXT索引。如果在MySQL 5.6中使用FULLTEXT索引,请确保使用的是InnoDB特定的FULLTEXT选项
  • 在MySQL 5.6之前,这意味着您不能将MyISAM转换为InnoDB。

MySQL 5.5及更高版本

若要查找哪些MyISAM表具有FULLTEXT索引,请运行以下查询:

select tbl.table_schema,tbl.table_name from
(
    select table_schema,table_name
    from information_schema.tables
    where engine='MyISAM'
    and table_schema NOT IN ('information_schema','mysql')
) tbl
INNER JOIN
(
    select table_schema,table_name
    from information_schema.statistics
    where index_type='FULLTEXT'
) ndx
USING (table_schema,table_name);

在升级到MySQL 5.6之前,此查询产生的任何内容都无法转换为InnoDB。

优化表

我的ISAM

  • MyISAM表缩小
  • ANALYZE TABLE对所有索引运行索引统计信息

创新数据库


感谢您的询问,尽管有小错字:“工程”而不是“引擎”
Andrew

@RolandoMySQLDBA:您可以添加InnoDB没有空间索引。
ypercubeᵀᴹ

2

我认为最大的陷阱将是围绕innodb进行事务处理。您可能想知道应用程序使用的MySQL库在默认情况下是否自动自动提交。

例如,Python不会自动提交。这意味着,如果应用程序在关闭连接之前立即插入行,则在您更改为innodb之后,现在将回滚插入。例如,python脚本需要确保调用connection.commit();。

另一个不同点可能是围绕多行插入或更新。考虑单个多行插入器

insert into tbl values (...row1...),  (...row2...),  (...rowN....);

考虑如果发生某种错误(例如在row3上发生唯一键冲突)会发生什么情况。使用MyISAM,前两行将被写入,在innodb下,所有写入的行将被回滚,即使发生这样的错误也不会写入任何内容。

使用innodb,您将进入死锁世界。这些天生不是坏的,除非它们以防止任何工作完成的频率出现。但是,您的应用程序将需要以这样的方式进行编码:它们可以预测死锁并适当地处理死锁(这很可能意味着重试)。

考虑内存/存储限制。Innodb比MyISAM占用更多资源。如果您有足够的RAM来保持缓冲池足够大以容纳所有表,那么您就很聪明了。

查找具有大主键的表。Innodb的聚集索引意味着每个二级索引都拥有对应行PK的另一个副本。如果您有2个二级索引,则意味着每行PK被存储3次(PK +每个索引)。如果pk跨越几种列和大型数据类型(例如char(N)),则可以看到在innodb下索引需求如何快速爆炸。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.