1

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

对于它的价值,我将这个项目托管在带有 RDS 的 EC2 上。

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

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

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

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

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

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

还有其他想法吗?建议?

谢谢!

4

2 回答 2

2

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

当您要读取写入行时,您将不得不使用 InnoDB 是否允许对每一行进行并发访问(读取器不会阻止写入器,写入器不会阻止读取器)

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

于 2011-03-11T23:07:47.130 回答
0

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

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

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

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

于 2011-03-11T23:21:56.110 回答