1

我正在做一个项目,其中我有类似于 StackOverFlow 的上下投票选项。我在数据库设计方面没有太多经验,因此我遇到了以下问题,

首先,这是我的投票表结构:

  1. voteId -----带有主键的AUTO_INCREMENT。
  2. mediaId ----用户投赞成票/反对票的媒体。
  3. userId -----投票的用户。
  4. voteMode ---1 表示赞成票,0 表示反对票。这是一个整数字段。

在这种情况下,如果我有 100 个用户和 100 个媒体,那么我将在此表中总共有 100x100 条记录。

这里出现的问题是数据库正在处理大量记录,而投票按钮现在反应迟钝。这让我的客户不高兴,让我陷入困境。

谁能建议我一个更好的模型来避免这个巨大的桌子?

我正在使用jQuery.ajax 将我的投票发布到服务器。此外,该项目基于PHP 和 Zend Framework 1.11。因此,当我单击 UP 图标时,需要一些时间来响应。Mozilla 曾经崩溃过某些时候。我通过包含大量垃圾记录(大约 15000 条)的循环进行了插入测试

4

3 回答 3

1

您可以尝试这些表模式的升级:

//All id's are now unsigned , As you do not need any sign 
ALTER TABLE `voting` 
CHANGE `voteid` `voteid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
CHANGE `mediaId` `mediaId` INT(11) UNSIGNED NOT NULL, 
CHANGE `userId` `userId` INT(11) UNSIGNED NOT NULL, 
//ENUM datatype as you need only 2 type of value
CHANGE `voteMode` `voteMode` ENUM('1' , '2') NOT NULL ; 

//Adding index , it will surely increase some speed
//Do **not use** index in **columns you do not need**
ALTER TABLE  `voting` ADD INDEX (  `mediaId` ,  `userId` ) ;

浏览Mysql Index以了解有关索引的更多信息。

如果您使用的是MyISAM 存储引擎,那么我建议您使用InnoDB 存储引擎可以帮助您决定应该使用哪个引擎。

其他一些可能对您有帮助的技巧是:

  1. MySQL 查询缓存
  2. php中的准备语句
  3. 列分区

有关 MySql 数据库优化的一些资源:

  1. MySQL 调优
  2. mysql优化
  3. 真实世界的可扩展性 MySQL
于 2012-09-10T11:43:44.040 回答
1

好的,有两件事。15k 条记录不算什么,因此几乎不会造成问题。我正在使用具有 150M 行的表,并且查询在 0.005 秒内仍然表现良好

  1. 我怀疑您使用的是 MyIsam 而不是 InnoDB。使用 MyIsam,每次插入(或更新)都会锁定整个表。因此,当有人投票时,表格被锁定,其他人无法从中读取。如果您有成千上万的用户,这可能会成为一个问题。

  2. 确保你有正确的索引。我不确定哪些查询很慢(以及有多慢!),但请确保您在搜索的列上有一个索引(可能是 mediaId)。

如果您想要更好的建议,请发布速度较慢的查询。

于 2012-09-10T11:41:37.817 回答
0

如果您想跟踪哪些用户为 x 媒体投票,并且每个用户都投票,那么您的最小数据量为users * media.

如果你想拥有更少的数据,你必须做出让步。也许让用户匿名注册和投票?如果可以从投票行为中提炼出个人偏好,大多数用户都不会很高兴。

于 2012-09-10T11:29:45.023 回答