私は比較的単純なゲームを持っています。このクエリが正しく最適化されていないようです。
私は標準的なusers
テーブルを持っています。expansions
ゲームの拡張に関する一般的な情報を保持するテーブルがあります。ユーザーが拡張でレベルを破るたびに、playlog
最終スコアを示す行が追加されます (したがって、最初は、拡張のプレイログ テーブルに 0 行あります)。
EXPLAIN SELECT users.username, expansions.title, expansions.description,
COUNT( playlog.id ) as levels_beaten
FROM users
INNER JOIN expansions
LEFT JOIN playlog ON users.id = playlog.user_id
AND expansions.id = playlog.expansions_id
WHERE users.id = 10
GROUP BY expansions.id
ORDER BY expansions.order_hint DESC
次のインデックスがあります。
ユーザー id - primary, username - unique
拡張 id - primary, order_hint - index
プレイログ expansions_id - foreign, user_id - foreign
しばらく前にデータベースクラスを受講しましたが、一時的なファイルソートの使用が悪いと思われていたことを覚えていますが、それを修正する方法や、このインスタンスで問題ないかどうかはよく覚えていません (また、ユーザー名を選択しない場合、それはExplain の最初の行にも「Using Index」と記載されています)。