3

我想问一下是否有更快的方法来进行这个查询?实际上它需要大约 100 秒才能完成。我在一个表中有大约 10 000 000 (1 GB) 行。这是统计信息生成脚本。

这是查询:

  $results=mysql_query("SELECT * FROM hawkeye WHERE player_id='".$playerID."'") or die("MYSQL ERROR: ".mysql_error());

然后是php代码:

  $row = mysql_fetch_array($results)
  if($row["action"] == 4){$commandcount++;}
  else if($row["action"] == 3){$chatcount++;}
  else if($row["action"] == 1){$placedcount++;}
  else if($row["action"] == 0){$breakcount++;}
  else if($row["action"] == 5){$joincount++;}
  else if($row["action"] == 6){$quitcount++;}
  else if($row["action"] == 7){$qteleportcount++;}
  else if($row["action"] == 12){$pvpdeathcount++;}
  else if($row["action"] == 21){$mobkillcount++;}
  else if($row["action"] == 22){$otherdeathcount++;}
  else {}

感谢您的回答!

4

5 回答 5

11

使用 MYSQL 为您计算。它比 PHP 更快:

SELECT COUNT(*) AS action_count
     , action
FROM hawkeye 
WHERE player_id='".$playerID."'"
GROUP BY action

while ($row = mysql_fetch_assoc($result))
{
    echo $row['action'] . ': ' . $row['action_count'] . "<br>" . PHP_EOL;
}
于 2012-06-18T16:24:30.707 回答
2

关于什么

SELECT action, count(*) FROM hawkeye WHERE player_id='$playerID' GROUP BY action

所以每个动作类型你只会循环一次,而不是每个动作一次

于 2012-06-18T16:25:34.390 回答
1

您似乎正在尝试进行一些计算。尝试研究聚合或使用像 infobright 这样的分析数据库,它将聚合存储在内存中。避免执行 SELECT * 并执行实际的 SELECT column1, column2。大多数情况下,虽然读到了像 SUM、COUNT Group BY 和 Order By 这样的聚合。

于 2012-06-18T16:25:38.567 回答
1
$results=mysql_query("SELECT action, count(*) as `cnt` FROM hawkeye WHERE player_id='".$playerID."' GROUP BY action") or die("MYSQL ERROR: ".mysql_error());

while ($row = mysql_fetch_array($results)) {
  if($row["action"] == 4){$commandcount=$row["cnt"];}
  else if($row["action"] == 3){$chatcount=$row["cnt"];}
  else if($row["action"] == 1){$placedcount=$row["cnt"];}
  else if($row["action"] == 0){$breakcount=$row["cnt"];}
  else if($row["action"] == 5){$joincount=$row["cnt"];}
  else if($row["action"] == 6){$quitcount=$row["cnt"];}
  else if($row["action"] == 7){$qteleportcount=$row["cnt"];}
  else if($row["action"] == 12){$pvpdeathcount=$row["cnt"];}
  else if($row["action"] == 21){$mobkillcount=$row["cnt"];}
  else if($row["action"] == 22){$otherdeathcount=$row["cnt"];}
  else {}
}
于 2012-06-18T16:26:21.437 回答
1

向 hawkeye 表添加一个索引,该索引按player_id并遵循 John Conde 的建议。

于 2012-06-18T16:28:03.510 回答