MySQL更新声明是否过于昂贵?

时间:2011-03-11 22:54:29

标签: mysql amazon-ec2 scalability amazon-rds

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

为了它的价值,我将在EC2上使用RDS托管这个项目。

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

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

根据我一直在阅读的内容,MySQL在写一个表时会发生一种名为Table Locking的事情吗?由于此表也将被显着读取,是否会在行上使用UPDATE语句导致过多的开销/锁定?

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

  1. 频繁地(每秒或更多)在大表上执行UPDATE语句
  2. 有一个临时表,我在其中创建行,更新它们,并在准备就绪时(大约20分钟,直到该行完成),将行从登台表发送到主表。
  3. 我想避免使用临时表,因为它会让我的用户在看到内容之前等待大约20分钟,但我想知道它是否是一个必要的邪恶。

    还有其他想法吗?建议?

    谢谢!

2 个答案:

答案 0 :(得分:2)

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

由于你想阅读写行,你将不得不使用InnoDB它是否允许并行访问每一行(读者不会阻止编写者,编写者不会阻止读者)< / p>

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

答案 1 :(得分:0)

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

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

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

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