如何使用左连接更快地进行查询?

时间:2018-01-19 12:38:05

标签: mysql sql r left-join query-performance

我有三个表: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

1 个答案:

答案 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);