2016-09-19 7 views
0

MySQLクエリを最適化する必要があります。私は100.000未満のレコードで「賭ける」テーブルを持っています。今月のすべてのレコードを表示する必要があります。クエリ間のMySQL最適化日付

SELECT betting.id 
FROM betting, members 
WHERE members.status = 1 
and members.id = betting.user 
and betting.date between '2016-09-01' and '2016-09-30' 
and betting.status = 1 
and betting.type = 1; 

私が説明し、コマンドを試してみてください。

SIMPLE betting range user,date,type,type_2 type_2 7 NULL 4966 Using where 
SIMPLE members eq_ref PRIMARY PRIMARY 4 betting.user 1 Using where 

は、データベース検索を削減するチャンスがありますか?問題は、この結果を表示するページがあまりにも頻繁に呼び出され、CPUコストがかかることです。残念ながら私は結果をキャッシュすることはできません。ライブにする必要があるからです。何か案は ?ここで

+0

関連する列にインデックスがありますか – RiggsFolly

+0

mysqlでキャッシュの依存関係を使用できます。つまり、テーブルが変更されるまでキャッシュに結果を保持します。 –

+0

@RiggsFollyはい、私は(タイプ、結果、ステータス)のインデックスを持っています –

答えて

1

はあなたのクエリを理解するために(少なくとも私にとっては)簡単です形式で書かれている:

SELECT b.id 
FROM betting b join 
    members m 
    ON m.id = b.user 
WHERE m.status = 1 
     b.date between '2016-09-01' and '2016-09-30' and 
     b.status = 1 and 
     b.type = 1; 

私は最高のインデックス戦略があると思う:betting(status, type, date, user)members(id, status)

+0

私は可読性についてあなたに同意しますが、このクエリは役に立ちません。それでも約5000行で検索する必要があります。私のクエリがさらに最適化できるかどうかわかりません。 –

+1

@VinceCarter。 。 。インデックスを追加しましたか? –

+0

はい、状況はあまり変わっていません:1単純なb範囲のユーザー、日付、タイプ、タイプ2 type_2 5 NULL 4759インデックス条件の使用 1単純なeq_ref PRIMARY、id PRIMARY 4 b.user 1ここでの使用方法 –