在同一服务器上混合使用InnoDB和MyISAM表是常见的做法吗?


21

我在具有8GB RAM的服务器上运行着大约4.5GB的单个数据库。绝大多数表是MyIsam(约4.3GB),但是我很快将要把其中一些表转换为InnoDB。(这将是一个缓慢的过程,首先要关注最需要写入的表)。

在同时存在两种类型的存储引擎的情况下运行专用服务器有什么问题吗?


Is there anything wrong with running a dedicated server where both types of storage engines exist? 也许改写为Multiple types
约翰,

我说“两者”的唯一原因是因为这个问题与配置为“微调”的两个主要引擎有关。我试图忽略其他类型的引擎,例如MEMORY或MERGE,它们很少见,因此afaik并不是性能调整的对象。
Derek Downey

Answers:


18

只要您了解每个物理引擎的优缺点,在同一台物理计算机上使用多个存储引擎就 没有。所有插件存储类型都有性能方面的考虑,功能限制和用例。

例如,如果您有一个写入率为90%的小表,则可以选择MyISAM。如果可以轻松地重新生成数据并且它是一个小表,例如要排队,则可以选择“内存”。如果您有一个90%可读取的表,并且在查找时必须有数据,那么您可能会选择一个支持事务和可配置原子性的存储引擎,例如InnoDB。如果要通过不损坏数据的文件系统进行访问,则可以选择CSV。

但是,您可以在同一架构以及物理主机中安全地使用多个存储引擎。

不过,请注意,缓冲区在整个混乱中发挥了作用。如果同时使用MyISAM和InnoDB,则需要注意不要竞争key_buffer和innodb_buffer_pool。您将需要仔细计划,但这就是我们要做的。


4
+1另一个常见用例是MyISAM用于需要全文搜索的表,而InnoDB用于所有其他表。
亚萨

@Aseph:即使在您发表评论时,InnoDB也支持全文索引
BlueRaja-Danny Pflughoeft13年

2
^^^^“ MySQL 5.6功能”直到2013-02-05才
正式发布-randomx

1
@randymelder好答案。您能否详细说明“您将需要小心不要使key_buffer和innodb_buffer_pool竞争”的含义?
Neel 2014年

1
我想被证明是错误的,但是这里的逻辑看起来与此stackoverflow.com/a/6796566/5645769相反。
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

7

我不能告诉你这是否是常见的做法。我可以说说自己的经历。

我一直使用最好的工具来完成工作,因此我一直都在混合引擎。我的大多数项目都使用MyISAM作为默认引擎。

当我需要InnoDB上可用的特殊功能时,我会推荐它。

当一个表大部分是只读的时,我会在眨眼之前选择存档引擎。

知道机器服务器有足够的内存,我所有的临时数据都存储在堆表中。

我在过去看到一些混合MyISAM和InnoDB的速度下降,但这不是特定的MySQL问题。当您仅使用一个引擎时,就不会出现设计问题。实际上,使用错误的引擎会导致速度变慢,这仅仅是MyISAM,InnoDB还是两者的混合。很难定义一个公式来知道何时减速。只是实际测试可以告诉您。

当然,您无法在唯一查询中混合使用InnoDB和MyISAM来保持完整性和一致性。


归档引擎不支持索引,因此为什么要将其存储在归档中。
user4951 2012年

0

我试图避免在同一数据库中混合使用MyISAM和InnoDB表,但这是出于理智而非出于实际原因。但是,我发现使用带有MyISAM表的数据库进行全文搜索很有用,这样我就可以在网站上运行它。将其保存在一个单独的数据库中,每个条目都带有外键,这使得从事该数据库工作的任何其他开发人员都可以轻松地查看发生了什么。


使用MyISAM时如何拥有外键?
a_horse_with_no_name 2014年

术语错误,但像外键一样工作。我存储InnoDB表中项目的ID号,并使用它来对搜索结果进行页面查找。
Kenzo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.