MySQL:经常更新和读取同一行

时间:2016-02-12 18:31:20

标签: mysql amazon-web-services

我制作了一个应用程序,通过推送通知将轮询发送给用户,他们的回答时间很短。我们现在与一家新闻机构达成协议,很可能会有多达10万人在短时间内(例如5分钟)回答该公司发布的民意调查。

我有一个存储在Amazon RDS上的MySQL数据库。民意调查存储在一个innodb表中:

CREATE TABLE `polls` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categoryId` int(11) NOT NULL,
  `question` text CHARACTER SET utf8 NOT NULL,
  `expiresAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `sentAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type` int(11) NOT NULL,
  `opt1` int(11) DEFAULT '0',
  `opt2` int(11) DEFAULT '0',
  `text1` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
  `text2` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
  `special` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3284 DEFAULT CHARSET=latin1;

当人们开始投票时,我们将opt1或opt2的值增加1.例如,如果有人投票选择选项1:

UPDATE polls SET opt1=opt1 +1 WHERE id=4644";

如何配置MySQL以确保它能够支持这种流量负载?我试图通过官方文档,但我找不到我应该采取的步骤的清晰概述。显然我可以在AWS上购买更好的数据库,但我想确保我在这里没有犯错误。

顺便说一句,所有选择查询(当人们只是阅读民意调查时)都会被发送到AWS上的复制数据库。

非常感谢您的帮助,如果我忘了,请询问更多信息。

1 个答案:

答案 0 :(得分:0)

我为poll结果创建了一个单独的表,以便让update尽可能短,以便使用update语句。

CREATE TABLE `pollResults` (
  `poolId` int(11) NOT NULL AUTO_INCREMENT,
  `opt1` int(11) DEFAULT '0',
  `opt2` int(11) DEFAULT '0',
  PRIMARY KEY (`poolId`)
) ENGINE=InnoDB AUTO_INCREMENT=3284 DEFAULT CHARSET=latin1;

在您的民意调查表中,我会将所有文本列放在表的末尾,但这可能不是什么大问题。