gpt4 book ai didi

mysql - 将 InnoDB 表与 MyISAM 表连接起来

转载 作者:IT老高 更新时间:2023-10-28 13:00:04 27 4
gpt4 key购买 nike

我们有一组表,其中包含组织、组织用户、组织部门等元数据。所有这些表都将被大量读取,而写入操作很少。此外,表的大小会非常小(最大记录数约为 30K - 40K)

另一组表存储 OLTP 数据,如账单交易、用户操作等,这些数据将是读写繁重的。这些表会非常大(每个表大约有 3000 万条记录)

对于第一组表,我们计划使用 MyISAM,第二组表使用 InnoDb 引擎。我们的许多功能还需要在这 2 个集合中的表上进行 JOINS。

将 MyISAM 表与 InnoDB 表连接时是否存在任何性能问题?此外,我们在这种设计中可能会遇到任何其他问题(数据库备份、调整等)吗?

任何反馈都将不胜感激。

最佳答案

我立即跳出来的是 MyISAM

方面 #1:JOIN 本身

每当有涉及 MyISAM 和 InnoDB 的连接时,由于 MyISAM 参与查询和 MVCC,InnoDB 表最终将具有表级锁定行为而不是行级锁定。不能应用于 MyISAM 数据。 MVCC在某些情况下甚至不能应用于 InnoDB。

方面 #2:MyISAM 的参与

从另一个角度来看,如果通过 INSERT、UPDATE 或 DELETE 更新任何 MyISAM 表,则 JOIN 查询中涉及的 MyISAM 表将与其他 DB 连接锁定,并且 JOIN 查询必须等到 MyISAM 表可以读。不幸的是,如果在 JOIN 查询中混合使用 InnoDB 和 MyISAM,则 InnoDB 表将不得不像 JOIN 查询中的 MyISAM 伙伴一样遇到间歇性锁定,因为被阻止写入。

请记住 MVCC will still permit READ-UNCOMMITTED and REPEATABLE-READ transactions to work just fine and let certain views of data be available for other transactions. I cannot say the same for READ-COMMITTED and SERIALIZABLE .

方面 #3:查询优化器

MySQL 依靠索引基数来确定优化的 EXPLAIN 计划。 MyISAM 表中的索引基数是稳定的,直到表发生大量 INSERT、UPDATE 和 DELETE,您可以通过这些操作定期对 MyISAM 表运行 OPTIMIZE TABLE。 InnoDB 索引基数永远不会稳定!如果您运行 SHOW INDEXES FROM *innodbtable*;,您将看到每次运行该命令时索引基数都会发生变化。那是因为 InnoDB 会深入索引来估计基数。即使您对 InnoDB 表运行 OPTIMIZE TABLE,也只会对表进行碎片整理。 OPTIMIZE TABLE 将在内部运行 ANALYZE TABLE 以针对表生成索引统计信息。这适用于 MyISAM。 InnoDB 忽略它。

我对您的建议是全力以赴,将所有内容都转换为 InnoDB 并相应地优化您的设置。

更新 2012-12-18 15:56 EDT

信不信由你,有still an open ticket on InnoDB/MyISAM joining during a SELECT FOR UPDATE .如果您阅读它,它总结了以下分辨率:DON'T DO IT !!! .

关于mysql - 将 InnoDB 表与 MyISAM 表连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com