Answers:
这是一些陷阱
这是我之前写和发布的一些查询,这些查询如何为MyISAM密钥缓存和InnoDB缓冲池选择合适的大小。
若要查找哪些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。
我认为最大的陷阱将是围绕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下索引需求如何快速爆炸。