首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将表类型混合存储在单个MySQL DB中是正常的吗?

将表类型混合存储在单个MySQL DB中是正常的吗?
EN

Stack Overflow用户
提问于 2017-03-15 10:31:38
回答 1查看 69关注 0票数 0

在调试日常MySQL崩溃时,我注意到我的数据库有多种表类型。

这对我来说似乎很奇怪,但我既不知道它是怎么发生的,也不知道它是否会引起任何问题。是我需要修理的东西吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 10:47:25

嗯,这并不完全是一个错误,因为您可以为每个表选择您想要的任何表引擎。但这种组合可能会给你带来严重的麻烦。InnoDB支持事务,而MyISAM不支持事务!

如果您不知道所使用的事务是什么,那么:

事务确保一组查询中的每个查询都成功执行,或者没有一个查询成功执行。一个典型的例子是,客户订购了一些东西,并且相应地调整了他的余额。所以你会在数据库上做这样的事情:

代码语言:javascript
运行
复制
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。你可以很容易地用

代码语言:javascript
运行
复制
ALTER TABLE table_name ENGINE=InnoDB;

除了上面提到的问题,MyISAM正在慢慢地死去。性能现在没有太大的差别,它甚至有一些缺点,比如表锁定而不是行级锁定。你可以在网上找到很多信息。

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

代码语言:javascript
运行
复制
CREATE TABLE (
...
) ENGINE=whatever;

而其他人没有或者被遗忘了。

但是,可以用以下方法调整默认引擎

代码语言:javascript
运行
复制
SET GLOBAL default_storage_engine = InnoDB;

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

当您测试这一点时,请注意还有一个会话变量。要么调整这一点,要么启动新的会话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42807127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档