将表类型混合存储在单个MySQL数据库中是否正常?

时间:2017-03-15 10:31:38

标签: mysql innodb myisam

在调试每日MySQL崩溃时,我注意到我的数据库混合了表类型。

这对我来说似乎很奇怪,但我不知道它是如何发生的,或者是否会引起任何问题。这是我需要解决的问题吗?

enter image description here

1 个答案:

答案 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;(结束事务)中,确保INSERTUPDATE失败时撤消。

但是,在您的情况下,当其中一个表是MyISAM类型时,此表中的更改将不会撤消,并且您的数据库最终处于不一致状态。

因此我建议您将所有MyISAM表更改为InnoDB。您可以使用

轻松完成此操作
ALTER TABLE table_name ENGINE=InnoDB;

除了上面提到的问题,MyISAM还在慢慢死去。从表现来看,现在差别不大,甚至有一些缺点,比如表锁定而不是行级锁定。您可以在线找到大量信息。

混合的原因很可能是某些表创建者使用

指定了创建表的引擎
CREATE TABLE (
...
) ENGINE=whatever;

和其他人没有或忘记了。

但您可以使用

调整默认引擎
SET GLOBAL default_storage_engine = InnoDB;

然后,当未指定引擎时,将创建新表作为InnoDb。 (您也可以将此选项放在my.cnf中)

测试时,请注意还有一个SESSION变量。也可以调整它或开始新的会话。