MySQL更新语句是否太贵?

MySQL更新语句是否太贵?,mysql,amazon-ec2,scalability,amazon-rds,Mysql,Amazon Ec2,Scalability,Amazon Rds,我已经尽可能多地阅读了关于如何编写可伸缩MySQL模式的文章,但我仍然不确定这是否是一个好主意 值得一提的是,我用RDS在EC2上主持这个项目 在我的数据库中,我有一个核心表,它的写操作将多于读操作,我猜大约70%的写操作和30%的读操作 但是,当我在表中创建新行时,我需要每隔5秒左右向它添加更新。总的来说,由于每秒都要添加/更新多行,这意味着每秒左右都会执行UPDATE语句 根据我所读到的,MySQL有一种叫做表锁定的东西,当您向表写入时会发生这种情况吗?由于此表也将被大量读取,因此对行使用U

我已经尽可能多地阅读了关于如何编写可伸缩MySQL模式的文章,但我仍然不确定这是否是一个好主意

值得一提的是,我用RDS在EC2上主持这个项目

在我的数据库中,我有一个核心表,它的写操作将多于读操作,我猜大约70%的写操作和30%的读操作

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

根据我所读到的,MySQL有一种叫做表锁定的东西,当您向表写入时会发生这种情况吗?由于此表也将被大量读取,因此对行使用UPDATE语句是否会导致太多开销/锁定

据我所知,我的选择是:

请每隔一秒钟或更长时间频繁更新一个大表上的语句 有一个暂存表,我在其中创建行,更新行,当准备就绪后大约20分钟,直到行完成,将行从暂存表发送到主表。 我想避免使用staging表,因为它会让我的用户等待大约20分钟才能看到内容,但我想知道这是否是一个必要的缺点

还有其他想法吗?建议


谢谢大家!

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

当您想要读写行时,您必须使用InnoDB,因为它将允许并发访问每行读卡器不阻止写卡器,写卡器不阻止读卡器


如果您根据主键对行进行udpate,那么如果您的服务器能够跟上由此生成的IO,那么这些行的速度应该相当快。

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

您似乎要问的真正问题似乎更多的是并发性,而不是性能。具体地说,您似乎在问,通过大量的小更新还是更少的批量更新(每个更新包含相同的总更改数),您是否可以获得更好的并发性

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


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

我确实在根据主键更新行。我还没有决定使用存储引擎,但我听说InnoDB在大多数情况下速度不是很快?但在我的例子中,正如您所指出的,InnoDB似乎是更好的解决方案,因为我不想锁定整个表,只锁定特定的一行。@user大多数应用程序的读取率约为90-95%,写入次数很少,这就是MyISAM被认为稍微快一点的地方。InnoDB具有更好的数据完整性,以确保数据不会损坏,最明显的是MyISAM不支持事务。在这种情况下,MyISAM的表锁定几乎肯定会使其速度变慢,因为它适用于高读低写的情况。谢谢你的洞察力@用户59%-你最好检查你的来源,最好检查我的个人资料,看看我回答的所有与性能相关的问题,如问题。请帮帮我,我的myisam系统糟透了。。。答:使用innodb!嗯,所以对InnoDB表进行频繁的更新是可以的?只要它不会阻碍那些本该成功的选择,就很难做出这样一个笼统的声明。几乎总是这样,你需要在你的应用程序可能运行的条件下测试它。我建议的要点是仔细阅读您使用的任何DB引擎的锁定。这是一个棘手的问题,如果你做得不对,可能会产生重大影响。