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

zlhcx6iw  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(397)

我有三个表:users(id)、projects(id\u project、owner\u id)和followers(repo\u id、user\u id)。我想数一数有多少追随者一个项目。我想返回所有的用户项目,有没有追随者。
其中:id=owner\u id=user\u id\u project=repo\u id
我在查询中报告了1000多个用户。我做到了:

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。
你好,塔西亚娜

xjreopfe

xjreopfe1#

有时切换到相关子查询可以加快此类查询的速度:

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 table。所以,这应该是你想要的:

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

相关问题