370,000,000(3億7千万)以上の行を含むデータベースのPHPスクリプトで、次のMySQLクエリを使用しています。私はそれが非常にリソース集約的で、この1つのクエリを実行するには時間がかかることを知っています。誰も私はどのようにクエリを最適化することができるか、またはより速い別の方法で情報を取得するか知っていますか?このMySQLクエリを最適化するにはどうすればよいですか?
表情報:
games | longint, unsigned, Primary Key win | bit(1) loss | bit(1)
問合せ:あなたの助けを事前に
SELECT MID(game
,{$len},1) ASmove
, COUNT(*) ASgames
, SUM(win
) ASwins
, SUM(loss
) ASlosses
FROMgames
WHEREgame
>{$something} ANDgame
<{$something_else} GROUP BYmove
ありがとう!私が作ることができ
LIKEを数値に使用する際に非常に間違ったことがあります。MID()のグループ化と同じですが、間違っています。どうしてそれをするの? 最後に、「勝利」と「損失」の列が複数あるのではなく、「勝ち」、「損失」または「引き分け」の値を持つ「結果」列がないのはなぜですか? –
LIKEか、より大きいかより小さいかのいずれかです。いずれにしても大きな違いはないとは思っていませんでした。 MID()によるグループ分けは基本的に 'ゲーム'の次の数字をグループ化します。 MID(ゲーム、1、{$ len})と同じです。勝敗はどちらかの方法で2ビットのスペースを取るので、それは問題ではありません。 – dampkwab
数値にLIKEを使用すると型キャストが発生するため、効率が悪くなければなりません。勝敗の列については、1ビットだけではなく、1バイトずつ占有するのではないかと思います。 「なぜ」と尋ねるのは、おそらくもっと具体的だったはずです。実際の質問は、なぜLIKEを使用して範囲で照会してから、数値のテキスト表現を使用して結果をグループ化する必要があるかということです。あなたの "ゲーム"の列が実際に保持するデータ(実際にはbtwを記述するべきもの)はわかりませんが、あなたの問題はデータベース設計であり、効率の良いクエリではありません。 –