0

これが私のサンプルクエリです:

SELECT userid,count(*)
FROM hits
GROUP BY userid

私のテーブルはこんな感じです

id | ユーザーID| 時間...など

ここで、idは主キーであり、このテーブルを使用して、ページ上のすべての訪問を保存します。つまり、私のテーブルには200,000以上の行があります。

ユーザーIDについて、Xがクエリ内のどのランクにあるかを調べたいとします。これは、そのユーザーIDを持つユーザーよりも多くのユーザーがそのページにアクセスしたことを意味します。

このような質問がたくさんあることは知っていますが、同じではありません。

  1. MyQueryにはgroupbyがあります
  2. 私はここでかなりの数の答えを試しましたが、何も返さないものもあれば、5〜10分かかるものもあります。もっと速くする必要があります。

それ以上の疑問については、plsはコメントで明確にします

ありがとう

4

1 に答える 1

0

複数の行を返すことが予想されるクエリでのカウント/グループ化は、クエリがテーブル内のすべての行にアクセスする必要があるため、徐々に遅くなります。一般に、このようなレポートを頻繁に実行することが予想され、テーブルが拡大し続けることが予想される場合は、その値をキャッシュされた値にロールインする必要があります(したがって、すべての結果を引き続き保存する必要がありますが、カウンターに追加する必要もあります。そのユーザーのユーザーレコード)。もちろん、これは、user_id列にインデックスがあり、usersテーブルに外部キーがあるかどうかという問題も引き起こします。これにより、クエリが大幅に高速化されます。

于 2012-06-22T20:20:25.013 に答える