【问题标题】:Are MySQL Update Statements Too Expensive?MySQL 更新语句是否过于昂贵?
【发布时间】:2012-07-02 19:18:45
【问题描述】:

我一直在尽可能多地阅读有关如何编写可扩展 MySQL 架构的信息,但我仍然不确定这是否是个好主意。

无论如何,我将这个项目托管在带有 RDS 的 EC2 上。

在我的数据库中,我有一个核心表,它的写入比读取多(我猜大约 70% 的写入和 30% 的读取)。

但是,当我在表中创建新行时,我需要每 5 秒左右添加一次更新。总的来说,由于每秒将添加/更新多行,这意味着每秒钟左右执行一条 UPDATE 语句。

根据我一直在阅读的内容,MySQL 有一种称为表锁定的东西,当您写入表时会发生这种情况?由于该表也将被大量读取,因此在行上使用 UPDATE 语句会导致过多的开销/锁定吗?

我的选择(据我所知)是:

  1. 频繁(每秒或更多)对大型表执行 UPDATE 语句
  2. 有一个暂存表,我可以在其中创建行、更新它们,并在准备好后(大约 20 分钟直到行完成),将行从暂存表传送到主表。

我想避免临时表,因为它让我的用户等待大约 20 分钟才能看到内容,但我想知道这是否是必要的邪恶。

还有其他想法吗?有什么建议吗?

谢谢!

【问题讨论】:

    标签: mysql amazon-ec2 scalability amazon-rds


    【解决方案1】:

    是否应用表锁取决于存储引擎。 MyISAM 做表锁,InnoDB 做行锁。

    当您想要读取和写入行时,您将不得不使用 InnoDB,因为它允许并发访问每一行(读取器不会阻止写入器,写入器不会阻止读取器)

    如果您根据主键更新行,它们应该相当快(如果您的服务器可以跟上由此产生的 IO)。

    【讨论】:

    • 我确实在根据主键更新行。我还没有决定使用存储引擎,但我听说 InnoDB 在大多数情况下都不是很快?但就我而言,正如您指出的那样,InnoDB 似乎是更好的解决方案,因为我不想锁定整个表,只锁定特定行。
    • @user 大多数应用程序的读取率约为 90-95%,写入次数很少,这就是 MyISAM 被认为稍快的地方。 InnoDB 具有更好的数据完整性,以确保数据不会被破坏(最值得注意的是 MyISAM 不支持事务)。在这种情况下,MyISAM 的表锁定几乎肯定会使其变慢,因为它适用于高读低写场景。
    • 这很有意义。感谢您的洞察力!
    • @user59% - 你最好检查你的来源,最好还是检查我的个人资料,看看我回答的所有与性能相关的问题,即问题。请帮忙,我的myisam系统很烂... ans。使用 innodb !
    【解决方案2】:

    无论更新语句是否昂贵,看起来您无论如何都需要执行它们。如果您可以选择不更新表格,显然这会更高效,但我认为情况并非如此。

    无论如何,您似乎要问的真正问题似乎更多是关于并发性而不是性能。具体来说,您似乎在问,是否通过大量小更新或更少的批量更新获得更好的并发性,每个更新都包含相同的更改总数。

    根据我的经验,你最好进行大量的小更新,而不是为了并发而对它们进行批处理。但是,如果将它们批量处理,通常会获得更好的性能(对于更新)。

    要了解的另一件事是锁有多种类型。更新和选择对表的锁是不一样的,还有关于你的语句是锁定一行、一页还是整个表的考虑。通常锁是相当本地化的,但对于这种类型的应用程序,您需要阅读锁定策略的细节以及如何根据您的特定需求对其进行操作。

    【讨论】:

    • 嗯。那么在 InnoDB 表上进行非常频繁的更新就可以了吗?只要它不会阻止应该解决的选择
    • 很难做出如此笼统的陈述。几乎总是这样,您需要在您的应用程序运行的可能条件下对其进行测试。我的建议的要点是阅读锁定您使用的任何数据库引擎。这是一个棘手的问题,如果你做错了,可能会产生重大影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多