少なくとも1つのレコードの存在を検出user_activitiesテーブルは非常に大きく、3億以上の行があります。のMySQL:</p> <p>ユーザ(ID、名前)</p> <p>user_activities(ID、USER_ID、ACTIVITY_ID、のcreated_at)</p> <p>:私は2つのテーブルを持っている大きな結合テーブル
特定の期間内にどのユーザーが何らかのアクティビティを実行したことを検出しようとしています。つまり、特定のcreated_atの範囲のuser_activitiesテーブルに結合された行が存在するユーザーテーブルの行。
INNER JOIN、GROUP BY、およびWHERE句でこれを行うことはできますが、私の日付範囲内のすべてのuser_activities行に当たると思われるので、クエリは長い時間実行されます。
私は本当に "何個"の活動を気にしません。だから実際に私はちょうど1を見つけた後に停止することができたときにカウントを取得するためにグループ化しています(例えば210アクティビティ)。
すべてのuser_activity行をグループ化するのではなく、これを行うより効率的な方法はありますか?詳細については
は、ここでは正常に動作しますが、長い時間がかかり、現在のクエリでは、です:事前に
SELECT u.id, u.name, COUNT(ua.id) AS activity_count
FROM users u
INNER JOIN user_activity ua ON u.id=ua.user_id
WHERE ua.created_at > '2017-01-01' AND ua.created_at < '2017-03-01'
GROUP BY u.id
HAVING activity_count > 0;
ありがとう!
を返します。それ以外の、与えられた条件を満足するかどうか、これは単にコラム RET = 1 を返します。含まれています。 (つまり、activity_countは常に0より大きくなります) – jarlh
したがって、COUNT(ua.id)も削除できますか? – infaddict
ユーザーあたりのアクティビティ数をカウントする必要がありますか、ユーザーがアクティブである(つまり、日付範囲内に少なくとも1つのアクティビティがある)ことを知っていれば十分ですか? –