mysql – 使用MyISAM表加入InnoDB表

我们有一组表,其中包含元级数据,如组织,组织用户,组织部门等。所有这些表将被读取很重,只有很少的写操作。此外,表的大小将是相当小的(最大记录数将在30K – 40K左右)

另一组表存储OLTP数据,如票据交易,用户操作等,这将是读和写重。这些表相当巨大(每张表约3000万条记录)

对于第一组表,我们计划使用MyISAM和第二组使用InnoDb引擎。我们的许多功能也需要JOINS对这些2套的表。

在使用InnoDB表加入MyISAM表时有什么性能问题吗?此外,是否有任何其他可能的问题(数据库备份,调整等),我们可能会遇到这种设计?

任何反馈将非常感谢。

最佳答案
什么跳出我马上就是MyISAM。

ASPECT#1:JOIN本身

每当有涉及MyISAM和InnoDB的连接时,InnoDB表将最终具有表级锁定行为,而不是行级锁定,因为MyISAM涉及查询,而MVCC不能应用于MyISAM数据。 MVCC甚至不能应用于InnoDB在某些情况下。

ASPECT#2:MyISAM的参与

从另一个角度来看,如果通过INSERT,UPDATE或DELETE更新任何MyISAM表,则JOIN查询中涉及的MyISAM表将被其他DB连接锁定,并且JOIN查询必须等待,直到MyISAM表可以读取。不幸的是,如果在JOIN查询中混合使用InnoDB和MyISAM,InnoDB表将不得不体验一个间歇性的锁,就像它在JOIN查询中的MyISAM合作伙伴一样,因为被写入。

记住MVCC will still permit READ-UNCOMMITTED and REPEATABLE-READ transactions to work just fine and let certain views of data be available for other transactions. I cannot say the same for READ-COMMITTED and SERIALIZABLE

ASPECT#3:Query Optimizer

MySQL依靠索引基数来确定优化的EXPLAIN计划。索引基数在MyISAM表中是稳定的,直到表中发生很多INSERT,UPDATE和DELETE,您可以通过它们定期对MyISAM表运行OPTIMIZE TABLE。 InnoDB索引基数永远不会稳定!如果运行SHOW INDEXES FROM * innodbtable *;每次运行该命令,您将看到索引基数更改。这是因为InnoDB会潜入索引以估计基数。即使对InnoDB表运行OPTIMIZE TABLE,也只会对表进行碎片整理。 OPTIMIZE TABLE将在内部运行ANALYZE TABLE以对表生成索引统计信息。这适用于MyISAM。 InnoDB忽略它。

我对你的建议是全力以赴,将一切转换为InnoDB并相应地优化您的设置。

更新2012-12-18 15:56 EDT

不管你信不信,有still an open ticket on InnoDB/MyISAM joining during a SELECT FOR UPDATE.如果你读它,它总结如下的决议:DON’T DO IT !!!

转载注明原文:mysql – 使用MyISAM表加入InnoDB表 - 代码日志