何时应该将表从MyISAM更改为InnoDB?

6

这个问题是我之前的一个问题的延续:我是否正确认为InnoDb比MyISAM更适合频繁并发的更新和插入操作?

但这次我有具体的问题。
我们知道,当我们没有很多并发更新(插入)时,MyISAM比InnoDb更快。当我们有许多并发更新时,MyISAM表会被锁定,所有其他客户端都必须等待。

1)但是什么时候应该从MyISAM更改为InnoDb?每秒1次更新?每秒10次更新?每秒100次更新?
2)对于一个具体的例子,在我的网站上是否更好地将其中一个表更改为InnoDb,我通常每分钟进行几次更新(来自不同的会话),但有时可能会有约2-3次每秒的更新?

2个回答

3
我认为你的问题在之前提到的问题中已经得到了解答。
1)当你创建表时,InnoDB提供的优势不仅仅是行级锁定。当有多个SQL客户端进行更新时,速度更快,数据丢失/损坏的风险更小,引用完整性等等...每秒只有几个事务(TPS),你不太可能在性能上看到差异,但InnoDB更可靠,扩展性更好。
2)每秒只有2-3个TPS,你不会在InnoDB和MyISAM之间看到任何显着的差异。即使在相对古老的硬件上也是如此。
FYI,现代磁盘驱动器应该能够处理至少~200个更新事务每秒。
我建议你阅读关于InnoDB, MVCCACID的内容。

我理解InnoDb的优点,但我认为在共享Web托管上,性能和“轻盈”是首要考虑的。否则,我肯定会始终使用InnoDb。 - nightcoder
@nightcoder:那么你应该始终使用InnoDB。从大局来看,它比MyISAM更“轻”。 - tommym

1

如果可以的话,最好不要一次只更改一个表。

更改整个服务器。这样,您就可以为InnoDB工作负载而不是MyISAM工作负载调整服务器。两者是相互不兼容的(内存缓冲区分配给特定引擎;它们不能共享内存)。

假设您有16G的RAM,如果没有MyISAM表,您可能希望使用约12G的InnoDB缓冲池。

同样,如果只有MyISAM表,您可能希望完全关闭InnoDB,并将略少于一半的内存(例如6G)分配给myisam关键缓存。

混合的MyISAM-InnoDB服务器需要权衡内存调整。

此外,您只需要进行一次性能测试,而不是每次更改表时都进行测试。

在某些情况下,这是极度简化的,而在其他情况下则是错误的,说“我们知道MyISAM比InnoDb快”。

如果您已经为服务器正确地调整了InnoDB并且正在运行适当的服务器级硬件,则InnoDB应该能够在大多数查询上与MyISAM竞争(不包括完整的表扫描,但您不会经常执行此类操作,对吧)。

也就是说,除非你的数据属于"无关紧要的玩笑"级别。

如果你发现innodb对于插入/更新的速度慢得多,请记住它提供更好的耐久性 - 如果你将其调整为与MyISAM大致相同的耐久性,那么你会看到良好的性能。


好的,我们的主服务器上只使用InnoDb。 但是我在询问关于我们在共享托管上的网站,所以我认为您的想法并不适用,因为据我了解,在共享托管上的MySql服务器对于所有托管用户的所有数据库具有通用设置。 - nightcoder
如果您使用共享主机,就不能期望有良好的性能。希望您的数据库很小,否则您将面临性能灾难。共享主机不允许托管繁忙的网站或大型数据库。在这种情况下,性能通常并不是非常重要的。 - MarkR
我们有一个500Mb的数据库和每天数百名访客。查询可能足够复杂。但是网站运行良好,也许我们在选择主机方面很幸运。 - nightcoder
@nightcoder:500Mb相对较小。如果你调整了查询并添加了所有必要的索引,数据库几乎不会注意到你的存在。 - tommym
是的,这绝对是运气而不是判断;你不知道你正在与谁分享或者他们的破碎应用程序正在提交什么MySQL暴行。500M足够小,以至于它可以适应非常低配的服务器内存;如果你没有足够的性能,只需购买其中之一,它比评估替代方案的开发人员时间便宜得多。 - MarkR

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