频繁写作的列数更少吗? MySQL的

时间:2014-05-22 03:13:24

标签: mysql

我有一个应用程序,允许用户向上或向下投票。目前,我在视频表中有upvotes / downvotes,因为我想不出其中的原因(它们只是整数)。但是,这是一个案例,每个用户在投票时可能会对表格进行写入,这让我三思而行。

我唯一能想到的是,写入时MSQL应用的表锁可能会减慢读取速度。将选票移到他们自己的小型三栏桌上会更有效率吗?

(我确信MYSQL足够强大,除非流量变得非常繁重,但我喜欢在第一次做正确的事情。)

2 个答案:

答案 0 :(得分:2)

不幸的是,像大多数mysql性能问题一样,答案实际上是“它取决于”。你想要避免过度锁定可能会阻止读取,将投票放在自己的表中可能会有所帮助,或者它可能只是浪费时间和额外的复杂性。我认为最大的变量是事务大小 - 如果更新'vote'字段是大事务的一部分,那么它更有可能持有该锁并阻止进一步写入。如果投票是自动提交的,那么你可能没有太多担心。

最糟糕的情况是,如果事情确实变得冒险而你必须每秒处理数百万票,你可以将投票计数器移出到MEMORY表中,并每隔60秒左右将其与磁盘表同步。

答案 1 :(得分:0)

写入是否会影响您的读取取决于您的隔离级别。如果使用READ-COMMITED隔离级别,则读取将使用快照一致性但不需要锁定;但是,如果您在一次交易中多次提出相同的请求,则可能会产生不同的结果。如果您使用REPEATABLE-READ隔离级别,那么您的读取将获得锁定,但它们也将保证重新运行相同的查询将得到相同的结果。 (除了这两个之外还有其他隔离级别,您可以在MySQL网站上阅读。)

我建议您使用最低的隔离级别,但仍然可以获得所需的一致性。如果您可以使用READ-COMMITED隔离,那么使用它,您将不必担心READ-WRITE争用。

一切都取决于您的用例,但将列放在同一个表上应该没问题。我将它们分开的一种情况是,如果您对这些列有大量写入以及对表上其他列的大量不同写入,则它们都在中到大事务中执行。在那种情况下,我会将它们分开。