似乎我将需要与 MySQL 的事务,但我不知道如何在 Mysql 中使用混合 InnoDB/MyISAM 表管理事务,这一切似乎都是一团糟。
你可能会问我为什么要把桌子混在一起……答案是性能。正如许多开发人员所注意到的那样,InnoDB 表的性能通常很差,但作为回报,它会提供更高的隔离级别等......
有人对这个问题有什么建议吗?
似乎我将需要与 MySQL 的事务,但我不知道如何在 Mysql 中使用混合 InnoDB/MyISAM 表管理事务,这一切似乎都是一团糟。
你可能会问我为什么要把桌子混在一起……答案是性能。正如许多开发人员所注意到的那样,InnoDB 表的性能通常很差,但作为回报,它会提供更高的隔离级别等......
有人对这个问题有什么建议吗?
我认为您高估了 MyISAM 和 InnoDB 之间的性能差异。MyISAM 在数据仓库的情况下(例如全表扫描报告等)速度更快,但 InnoDB 实际上在许多情况下使用普通的 OLTP 查询可以更快。
InnoDB 更难调优,因为它有更多的旋钮,但是由于更好的锁定和更好的 I/O 模式,经过适当调优的 InnoDB 系统通常可以比 MyISAM 具有更高的吞吐量。
鉴于您不能在 MyISAM 表中进行事务处理,我不确定实际问题是什么。您需要事务的任何数据都必须在 InnoDB 表中,并且您可以使用正在使用的任何访问库或手动 SQL 命令来管理事务。
只使用一个引擎有一定的性能优势。
为一个引擎调整的服务器不会为另一个引擎调整 - 两者都需要您为其专用分配大量 RAM - 因此,您不能同时为它们提供最佳数量。
假设您的(显然是 64 位,但仍然相对较小)数据库服务器上有 8G 的内存,您可能希望将大约 3/4 的内存分配给您的 innodb 页面缓存。或者,如果您使用的是 MyISAM,您可能希望其中一半作为您的 key_buffer。你不能两者都做。
选择一个引擎并专门使用它。有一些方法可以解决性能问题——尽管它们中的大多数并不容易(即它们需要重新设计您的数据结构或应用程序)。
简短的回答是 MyISAM 中没有事务支持。如果您启动一个事务,在一些 InnoDB 表中添加或修改数据,在 MyISAM 表中添加或修改数据,然后您必须回滚,您的 MyISAM 更改将无法删除。为了支持这样的混合引擎,您的应用程序必须知道对存储 MyISAM 的任何数据的更改发生在事务“外部”。
如果您需要某些流程的事务,则隔离必须可事务的数据并将所有这些数据放在 InnoDB 中。