在调试日常MySQL崩溃时,我注意到我的数据库有多种表类型。
这对我来说似乎很奇怪,但我既不知道它是怎么发生的,也不知道它是否会引起任何问题。是我需要修理的东西吗?

发布于 2017-03-15 10:47:25
嗯,这并不完全是一个错误,因为您可以为每个表选择您想要的任何表引擎。但这种组合可能会给你带来严重的麻烦。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中)
当您测试这一点时,请注意还有一个会话变量。要么调整这一点,要么启动新的会话。
https://stackoverflow.com/questions/42807127
复制相似问题