将 table 类型的混合存储在单个 MySQL 数据库中是否正常?
Is it normal to have a mixture of table types stored in a single MySQL DB?
虽然每天调试 MySQL 崩溃,但我注意到我的数据库混合了 table 类型。
这对我来说似乎很奇怪,但我不知道它是如何发生的,也不知道它是否会导致任何问题。这是我需要解决的问题吗?
嗯,这不完全是错误,因为您可以为每个 table 选择您想要的任何 table 引擎。但是您可能会因这种组合而陷入严重的麻烦。 InnoDB 支持事务,而 MyISAM 不支持!
如果您不知道交易的用途:
事务确保一组查询中的每个查询都成功执行或其中 none 个查询成功。一个典型的例子是,客户订购了一些东西,他的余额也相应地进行了调整。所以你会在数据库上做这样的事情:
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
失败时撤消。
然而,在您的情况下,当 table 之一是 MyISAM 类型时,此 table 中的更改将不会撤消,您的数据库最终将处于不一致状态。
因此我的建议是,将所有 MyISAM table 更改为 InnoDB。您可以使用
轻松做到这一点
ALTER TABLE table_name ENGINE=InnoDB;
除了上面提到的问题,MyISAM 无论如何都在慢慢死去。在性能方面现在没有太大区别,它甚至有一些缺点,比如 table-locking 而不是 row-level locking。您可以在网上找到大量关于此的信息。
混合的原因很可能是某些 table 创作者在 table 创作时指定了引擎
CREATE TABLE (
...
) ENGINE=whatever;
其他人没有或者忘记了。
但是您可以使用
调整默认引擎
SET GLOBAL default_storage_engine = InnoDB;
然后,当未指定引擎时,将创建新的 tables 作为 InnoDb。
(您也可以将此选项放入 my.cnf)
当您对此进行测试时,请注意还有一个 SESSION 变量。要么也调整它,要么开始新的会话。
虽然每天调试 MySQL 崩溃,但我注意到我的数据库混合了 table 类型。
这对我来说似乎很奇怪,但我不知道它是如何发生的,也不知道它是否会导致任何问题。这是我需要解决的问题吗?
嗯,这不完全是错误,因为您可以为每个 table 选择您想要的任何 table 引擎。但是您可能会因这种组合而陷入严重的麻烦。 InnoDB 支持事务,而 MyISAM 不支持!
如果您不知道交易的用途:
事务确保一组查询中的每个查询都成功执行或其中 none 个查询成功。一个典型的例子是,客户订购了一些东西,他的余额也相应地进行了调整。所以你会在数据库上做这样的事情:
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
失败时撤消。
然而,在您的情况下,当 table 之一是 MyISAM 类型时,此 table 中的更改将不会撤消,您的数据库最终将处于不一致状态。
因此我的建议是,将所有 MyISAM table 更改为 InnoDB。您可以使用
轻松做到这一点ALTER TABLE table_name ENGINE=InnoDB;
除了上面提到的问题,MyISAM 无论如何都在慢慢死去。在性能方面现在没有太大区别,它甚至有一些缺点,比如 table-locking 而不是 row-level locking。您可以在网上找到大量关于此的信息。
混合的原因很可能是某些 table 创作者在 table 创作时指定了引擎
CREATE TABLE (
...
) ENGINE=whatever;
其他人没有或者忘记了。
但是您可以使用
调整默认引擎SET GLOBAL default_storage_engine = InnoDB;
然后,当未指定引擎时,将创建新的 tables 作为 InnoDb。 (您也可以将此选项放入 my.cnf)
当您对此进行测试时,请注意还有一个 SESSION 变量。要么也调整它,要么开始新的会话。