糟糕的头衔,抱歉无法简明扼要地阐述这个问题。
可能有500,000名用户获得该范围内的分数。
我的查询:
SELECT
a.userid,
a.interest,
b.name,
b.score
FROM interests AS a LEFT JOIN (SELECT
userid,
name,
score
FROM users
WHERE score > 10000 AND score < 50000) AS b ON a.userid = b.userid
WHERE a.interest = 'surfing'
ORDER BY b.score DESC
LIMIT 50
所以我认为我的上述查询会有效,但我不确定我是否会以有效的方式解决这个问题。我的理解是,它基本上选择所有兴趣行,其中兴趣=冲浪&#39; (这可能是50,000行)然后在用户表上执行JOIN,它本身可能返回500,000行。
我猜这里错过了一个基本概念/方法。希望它对某些人来说显而易见。我很感激帮助,干杯!
答案 0 :(得分:1)
您可能不需要派生的派生查询,并按
进行操作select
a.userid,
a.interest,
b.name,
b.score
from interests a
LEFT JOIN users b on b.userid = a.userid
where
b.score > 10000 AND b.score < 50000
and a.interest = 'surfing'
ORDER BY b.score DESC
LIMIT 50
添加一些索引会使它更快,如果userid是用户表的主键,那么你不需要在同一个表上重新索引它。
alter table interests add index user_inter_idx(interest,userid);
alter table users add index user_score_idx(score);
注意:确保在申请之前备份表格 他们的索引。
您还可以使用
检查查询运行状况 explain select ...
这将让您了解优化程序如何处理查询。
答案 1 :(得分:0)
select
i.userid,
i.interest,
u.name,
u.score
from
interests i
inner join users u on
i.userid = u.userid
where
u.score between 1000 and 50000 and
i.interest = 'surfing'
order by
u.score desc
limit 50
请记住添加以下索引: