我制作了一个应用程序,通过推送通知将轮询发送给用户,他们的回答时间很短。我们现在与一家新闻机构达成协议,很可能会有多达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上的复制数据库。
非常感谢您的帮助,如果我忘了,请询问更多信息。
答案 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;
在您的民意调查表中,我会将所有文本列放在表的末尾,但这可能不是什么大问题。