0

我有四张桌子:

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 从未添加的项目列表(在 lat/lng 半径内),这些项目在用户 1 的本地区域中至少出现 5 次,按该项目的评分降序排列,最后不包括任何被禁止的用户。

这是最好的方法吗?有没有更好的方法来处理这个查询?上面列出的索引运行速度非常慢。

4

0 回答 0