我有三个表:users(id),projects(id_project,owner_id)和followers(repo_id,user_id)。我想算一个项目有多少粉丝。我希望返回所有用户项目,包括和不包含关注者。
其中: id = owner_id = user_id id_project = repo_id
我在查询中报告了超过1,000个用户。我这样做了:
rs = dbSendQuery(mydb, "select p.id_project, p.owner_id, count(f.user_id) from users u left outer join projects p on p.owner_id = u.id and u.id in (123, 526, 852) left outer join followers f on p.id_project = f.repo_id group by p.id;")
查询太慢了。任何人都可以给我任何建议,使查询更快?我做错了吗?
也许,我可以分成两个查询,但是如何获得第一个查询的结果(这是用户的项目)并添加第二个查询(我将拥有项目的关注者数量)在R?
我正在使用R和mysql。
此致 Thaciana
答案 0 :(得分:3)
有时切换到相关子查询可以加速此类查询:
select p.id_project, p.owner_id, count(f.user_id)
from users u left outer join
projects p
on p.owner_id = u.id and u.id in (123, 526, 852) left outer join
followers f
on p.id_project = f.repo_id
group by p.id;
对于此查询,您需要users(id)
,projects(owner_id, id_project)
和followers(repo_id, user_id)
上的索引。
我注意到你并没有真正使用users
表。所以,这应该做你想要的:
select p.id_project, p.owner_id, count(f.user_id)
from projects p left outer join
followers f
on p.id_project = f.repo_id
where p.owner_id in (123, 526, 852)
group by p.id;
相同的索引应该适用于此查询,但显然不需要users
上的索引。
接下来,在MySQL中,相关子查询有时比聚合查询更快。所以,你可以尝试:
select p.id_project, p.owner_id,
(select count(*)
from followers f
where p.id_project = f.repo_id
) as num_followers
from projects p
where p.owner_id in (123, 526, 852);