0

次のようなクエリがあります。

SELECT 
  `Games`.`id`, `Games`.`name`, `Games`.`url` 
FROM 
  `Games`
LEFT JOIN 
  `GamesRuns` 
ON 
  Games.id = GamesRuns.game_id 
WHERE 
  (GamesRuns.date >= '2012-07-17 13:14:08') AND (Games.score = 0) AND (Games.active = 1) AND (Games.display = 1) 
GROUP BY 
  `Games`.`id` 
ORDER BY 
  SUM(GamesRuns.count) DESC 
LIMIT 5;

どの列にインデックスを配置する必要があるかを知りたいです。マルチインデックスとして GamesRuns.date と Games.score + Games.active + Games.display にあるはずだと思います。また、GamesRuns.count にインデックスを付けるのは SUM 関数内にあるため無意味だと思いますが、それ以外の場合 (SUM 関数を使用しない場合) にはインデックスも必要です。そうですか?EXPLAIN を使用すると、possible_key と key も PRIMARY であることが示されますが、PRIMARY は Games.id にすぎません。ご回答ありがとうございます。

4

2 に答える 2

0

一般に、可能であれば、結合に使用されるものと、where で使用されるものすべてにインデックスが必要です。

私の知る限り、MySql は関数インデックスをサポートしていないため (実際には使用していません)、SUM 関数にインデックスを設定することはできません。私が間違っていたら誰かが私を正してくれるでしょう

あなたの例では、Games.id、GamesRuns.game_id、GamesRuns.date、Games.score、Games.active、Games.displayにインデックスを付けます

于 2012-07-24T14:19:32.923 に答える
0

where内およびgroup by内でフィールドgames.idを使用しているため、フィールドは適切です。

フィールド gamesruns.game_id も。

date、score、active、display も候補です。ただし、その場合、レコードの数に注意する必要があります。したがって、残りはあなた次第であり、データに関するより深い調査に依存します.

ではごきげんよう

于 2012-07-24T14:19:38.560 に答える