ユーザーが自分のファイルのクリックに興味を持っているファイル共有サイトがあります。各クリックは、クリックテーブルに新しい行として保存されます。
通常、特定の日付範囲でクリック数を知りたいと考えています。
$statement = $db->prepare("SELECT COUNT(DISTINCT ip) FROM clicks WHERE user_id=? AND time BETWEEN ? AND ?");
$statement->execute(array($user_id, $from_date, $to_date));
さらに、特定のファイルのクリック数も確認できます。
$statement = $db->prepare("SELECT COUNT(DISTINCT ip) FROM clicks WHERE file_id=? AND time BETWEEN ? AND ?");
$statement->execute(array($file_id, $from_date, $to_date));
これらのクエリの問題は、user_idとfile_idがこのテーブルのキーではないことです(これらは一意ではありません)。代わりに、単純な「id」列が主キーですが、どのクエリにも影響を与えることはありません。
クラスター化インデックスを調査してきましたが、この場合の実装方法がわかりません。
クリックテーブルがかなり大きくなる(500万から600万行)ので、これらのクエリはより長くかかります(そして私はこのテーブルがもっと大きくなることを計画しています)。パーティショニングが私がしなければならないことかもしれないと読みましたか?
クラスタ化されたキーを作成するか、テーブルをパーティション化するか、またはその両方を行う必要がありますか?
参考までに、clicks
構造は次のとおりです。
id
time
user_id
ip
file_id