我应该在“只写”表中使用InnoDB还是MyISAM?

3
我有一张表格,基本上只是在写入内容。
可以将其视为“交易”列表,在其中保存所有详细信息,并且我还在另一个表格中存储了“总计”。出于性能考虑,该总计是冗余的,但如果需要,可以从这个交易表格重新计算。
从性能角度来看,对于同时向此表格进行INSERT(永远不会UPDATE)操作的多人使用,哪种方式更好?应该使用InnoDB还是MyISAM?
(我已经遇到了性能问题,我并没有过早地优化。)
3个回答

3

使用ARCHIVE存储方式。它专门为此类“写入频繁,读取几乎不发生”的应用程序而设计。


谢谢你的建议!我之前不知道Archive引擎。现在,从那篇文章来看,它似乎可以节省磁盘空间,但速度比MyISAM快不了多少,对吗? - Daniel Magliola
ARCHIVE比myISAM更适合写入,但是如果你需要读取它,由于需要进行全表扫描,速度会相当慢。根据你对应用程序的解释,你很少需要读取它,所以这应该没问题。 - O. Jones

2
通常,您可以使用MyISAM来处理只会增长的表。MyISAM还支持MERGE表,因此您不必仅使用一个巨大的表。
但是,如果您“永远”不会从中读取数据,为什么还要使用表呢?直接写入文件即可。我很好奇您的性能问题是什么。您可以考虑在复制时使用Blackhole表类型。在主服务器上使用Blackhole,在从服务器上使用MyISAM或Archive。

谢谢您的回复。我可能想要从中读取,并且如果我需要,从结构化表格中读取将比从文件中读取方便得多。当然,如果拥有这样的表格不切实际,我可以使用文件,但考虑到我正在处理的数据量,这似乎不应该是问题。至于Blackhole,我们还没有进行复制,只有一个MySQL。 - Daniel Magliola
性能问题在于有时整个MySQL服务器会冻结几秒钟,延迟所有其他请求。通过“慢查询日志”,这个查询似乎经常出现,所以它看起来很可疑,尽管它应该是相当无害的... - Daniel Magliola
也许,你会如何诊断它? - Daniel Magliola
死锁只会在使用InnoDB表时发生。MyISAM使用表锁定,不支持事务。虽然技术上可能会发生死锁(使用JOIN的UPDATE语句),但你在MyISAM中永远不应该看到死锁的情况。 - Brent Baisley
我使用MyISAM表每天“记录”超过一百万条记录而没有任何问题。不确定您要记录多少。 - Brent Baisley
MyISAM 会停止插入并等待 SELECT 语句完成后才继续执行。这可能是您延迟的原因。您应该运行 SHOW PROCESSLIST 查看在这些暂停期间插入操作的情况。 - Joshua Martell

0
你也可以使用INSERT DELAYED来配合MyISAM,这样在插入数据时可以立即返回,并且让MySQL在空闲时通过单独的线程插入数据。从应用程序的角度来看,这将加快插入速度并避免插入冲突。然而,如果服务器在写入之前崩溃,可能会导致数据不一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接