Php 投票按钮的数据库设计

Php 投票按钮的数据库设计,php,mysql,database,zend-framework,database-design,Php,Mysql,Database,Zend Framework,Database Design,我正在做一个项目,在这个项目中,我有上下类似StackOverFlow的投票选择。我在数据库设计方面没有太多经验,因此我提出了以下问题: 首先,这是我的投票表结构: voteId——主键自动递增 mediaId——用户对其投赞成票/反对票的媒体 userId——投票的用户 voteMode——1表示赞成票,0表示反对票。这是一个整数字段 在这种情况下,如果我有100个用户和100个媒体,那么我将有100x100条记录,所有记录都在这个表中 这里出现的问题是DB有很多记录,投票按钮现在反应非常慢。

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

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

  • voteId——主键自动递增
  • mediaId——用户对其投赞成票/反对票的媒体
  • userId——投票的用户
  • voteMode——1表示赞成票,0表示反对票。这是一个整数字段
  • 在这种情况下,如果我有100个用户和100个媒体,那么我将有100x100条记录,所有记录都在这个表中

    这里出现的问题是DB有很多记录,投票按钮现在反应非常慢。这让我的客户不高兴,让我陷入麻烦

    有人能给我推荐一个更好的型号来避开这张巨大的桌子吗?


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

    如果您想跟踪用户投票给x media的内容,以及每个用户的投票,那么您的最小数据量是
    users*media


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

    好的,有两件事。15k记录不算什么,所以几乎不会有问题。我使用的表有1.5亿行,查询在0.005s以下仍然运行良好

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

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


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

    您可以尝试升级表架构:

    //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数据库优化的一些参考资料:


  • 你在使用索引吗?什么查询比较慢?您使用的PHP框架与(或应该)数据库结构完全无关。使用JQuery这一事实更加说明了这一点。您可以编写一个投票桌面应用程序,但仍然需要相同的数据库。不要让这些事情扰乱你的决策。不,我不是。不太熟悉,韦恩。我以前从未尝试过很多DB。向一个几乎没有经验的“客户”提供服务,往好里说似乎是有风险的,往坏里说是完全不负责任的。当一个人投票时,你是在插入数据库,对吗?这种情况发生得很慢吗?是的,有没有其他方法来存储这些数据…?我已经限制了多次投票和匿名投票。请查看我对您在tophere上提出的问题的评论:事实上,我正在使用Citrix,DB就在里面。这就是我输入字段而不是查询的原因。我不能从中复制任何东西。但是让我检查一下我的索引。明白了,伙计,实际上没有定义索引。。。!我尝试了SHOW CREATE TABLE,但在那里找不到。另外,我只使用InnoDB。坦率地说,我对MySQL和DB操作知之甚少。我刚才试过索引。工作很好……现在工作很好。现在我开始和Zend一起研究Lucene,让它更快。谢谢你提供的信息。让我试试这个。