使用MyISAM表joinInnoDB表

我们有一套包含组织机构,组织机构用户,组织机构等元数据数据的表格。所有这些表格都将被重读,只有很less的写操作。 而且,表格大小也会相当小(最大logging数量大概在3万到4万)

另一组表存储OLTP数据,如账单交易,用户操作等,这些数据都会被读写。 这些表格将是相当巨大的(每桌约3千万logging)

对于第一组表我们计划与MyISAM一起使用,第二组使用InnoDb引擎。 我们的许多function还需要在这两套桌子上join连接。

使用InnoDB表连接MyISAM表有没有任何性能问题? 另外,有没有其他可能的问题(数据库备份,调整等),我们可能遇到这种devise?

任何反馈将不胜感激。

我立即跳出来的是MyISAM

ASPECT#1:JOIN本身

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

ASPECT#2:MyISAM的参与

从另一个angular度来看,如果任何MyISAM表正在通过INSERT,UPDATE或DELETE进行更新,则JOIN查询中涉及的MyISAM表将被其他数据库连接locking,并且JOIN查询必须等待,直到可以读取MyISAM表。 不幸的是,如果在JOIN查询中混合使用InnoDB和MyISAM,InnoDB表将不得不像JOIN查询中的MyISAM合作伙伴那样经历一个间歇性的锁,

请记住, MVCC仍然会允许READ-UNCOMMITTED和REPEATABLE-READ事务正常工作,并让某些数据视图可用于其他事务。 我不能说相同的READ-COMMITTED和SERIALIZABLE 。

ASPECT#3:查询优化器

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

我的build议是全力以赴,把所有东西都转换成InnoDB,并相应地优化你的设置。

更新2012-12-18 15:56 EDT

信不信由你, InnoDB / MyISAM在SELECT FOR UPDATE期间仍然有一个打开的票证 。 如果你阅读它,它总结的决议如下: 不要这样做!

我不认为事务pipe理将会正常工作,或者根本不可能,因为MyISAM表不处理它。