从具有20 000 000行的表中选择Count

时间:2011-07-02 21:26:37

标签: mysql database-design

我有一个在线橄榄球经理游戏。每个注册用户都有一个团队,每个团队最初有25个玩家。有友谊,联赛,杯赛。

我想为每个玩家页面显示以下数字:

  • 正式比赛,
  • 尝试,
  • 转换,
  • penalities,
  • dropgoals

并为每个类别:

  • 在这个季节;
  • 在他的职业生涯中;
  • 为国家队;
  • 代表U-20国家队

我有两个选择:

    $query = "SELECT id FROM tbl_matches WHERE type='0' AND standing='1'";
    $query = mysql_query($query, $is_connected) or die('Can\'t connect to database.');
    while ($match = mysql_fetch_array($query)) {
        $query2 = "SELECT COUNT(*) as 'number' FROM tbl_comm WHERE matchid='$match[id]' AND player='$player' and result='5'";
         $query2 = mysql_query($query2, $is_connected) or die('Can\'t connect to database.');
         $try = mysql_fetch_array($query2);         
     } 

此脚本搜索所选玩家所玩的每场正式比赛。然后得到该比赛的报告(每场比赛大约20条评论线)并检查每一行是否搜索过的球员有一次尝试。

问题是,在几个季节里,评论页面可能会有大约2 000 000行。我的脚本会加载缓慢(用户值得注意)吗?

第二个选项是创建一个包含玩家统计数据的表格,其中大约有21个小组。

你建议我做什么?

1 个答案:

答案 0 :(得分:1)

为什么所有这些单独的查询都可以将它们全部组合在一起并按ID计算:

select tbl_matches.id,count(*)
  from tbl_matches join tbl_comm on tbl_matches.id = tbl_comm.matchid
 where tbl_comm.player = '$player'
   and tbl_comm.result = '5'
   and tbl_matches.type='0'
   and tbl_matches.standing='1'
 group by tbl_matches.id;

如果您需要其他列,只需将它们添加到选择列和逐列列表中。

另外:您应该非常谨慎地将$player直接替换为您的查询。如果该字符串未正确转义,则可能是SQL注入攻击的来源。

编辑:根据Jonathan的评论修复查询