答案 0 :(得分:1)
嗯,这不是一个错误,因为你可以为每个表选择你想要的任何表引擎。但是你可能会遇到这种组合的严重问题。 InnoDB支持交易,而MyISAM则不支持!
如果您不知道用于什么交易:
事务确保一组查询中的每个查询都成功执行,或者都不执行。一个典型的例子是,客户订购了一些东西,并相应地调整了他的余额。所以你要在数据库上做这样的事情:
START TRANSACTION;
INSERT INTO orders (item, client, price) VALUES ('whatever', 1, 100.00);
UPDATE clients_credit SET balance = balance - 100.00 WHERE client = 1;
COMMIT;
将这两个查询放在START TRANSACTION;
和COMMIT;
(结束事务)中,确保INSERT
在UPDATE
失败时撤消。
但是,在您的情况下,当其中一个表是MyISAM类型时,此表中的更改将不会撤消,并且您的数据库最终处于不一致状态。
因此我建议您将所有MyISAM表更改为InnoDB。您可以使用
轻松完成此操作ALTER TABLE table_name ENGINE=InnoDB;
除了上面提到的问题,MyISAM还在慢慢死去。从表现来看,现在差别不大,甚至有一些缺点,比如表锁定而不是行级锁定。您可以在线找到大量信息。
混合的原因很可能是某些表创建者使用
指定了创建表的引擎CREATE TABLE (
...
) ENGINE=whatever;
和其他人没有或忘记了。
但您可以使用
调整默认引擎SET GLOBAL default_storage_engine = InnoDB;
然后,当未指定引擎时,将创建新表作为InnoDb。 (您也可以将此选项放在my.cnf中)
测试时,请注意还有一个SESSION变量。也可以调整它或开始新的会话。