0

私は4つのテーブルを持っています:

activity (activity_id (PRIMARY), item_id, geolat, geolng, user_id, created_at)
users (user_id (PRIMARY), user_name, first_name, last_name, user_banned)
items (item_id (PRIMARY), item_name)
ratings (item_id (PRIMARY), avg_rating_score)

次のクエリを実行したいと思います。

SELECT item_name, count(distinct activity.user_id) as distinct_user_count, ratings.avg_rating_score
FROM activity
INNER JOIN users on activity.user_id = users.user_id
INNER JOIN items on activity.item_id = items.item_id
INNER JOIN ratings on activity.item_id = ratings.item_id
WHERE activity.user_id != 1
AND (activity.geolat BETWEEN 'XXXXX' and 'XXXX' and activity.geolng BETWEEN 'XXXX' and 'XXXX') 
AND (users.user_banned = 0)
GROUP by activity.item_id
HAVING distinct_user_count >= 5
ORDER by avg_rating_score DESC
LIMIT 0,5

この結合の適切なインデックスに苦労しています。今私は持っています:

ALTER TABLE activity ADD INDEX (user_id)
ALTER TABLE activity ADD INDEX (item_id)
ALTER TABLE activity ADD INDEX (geolat)
ALTER TABLE activity ADD INDEX (geolng)
ALTER TABLE users ADD INDEX (user_banned)

クエリの目的は、ユーザー 1 が一度も追加したことがなく、ユーザー 1 のローカル エリアで少なくとも 5 回発生した項目 (lat/lng 半径内) のリストを、その項目の評価の降順で取得することです。 、そして最後に禁止されたユーザーを含めません。

これは最善のアプローチですか?このクエリに取り組むより良い方法はありますか? 上記のインデックスでは、実行速度が非常に遅くなります。

4

0 に答える 0