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

したがって、アクションごとに1回ではなく、アクションタイプごとに1回だけ循環します。

于 2012-06-18T16:25:34.390 に答える
1

いくつかの計算を行おうとしているようです。アグリゲートの実行を検討したり、アグリゲートをメモリに格納するinfobrightなどの分析データベースを使用したりしてみてください。SELECT *を実行せず、実際のSELECT column1、column2を実行します。ほとんどの場合、SUM、COUNT Group BY、OrderByなどの集計を実行するために読み込まれます。

于 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テーブルにインデックスを追加し、JohnCondeplayer_idの提案に従います。

于 2012-06-18T16:28:03.510 に答える