【问题标题】:How do I make my query using left join to be faster?如何使用左连接更快地进行查询?
【发布时间】:2018-01-19 12:38:05
【问题描述】:

我有三个表:用户(id)、项目(id_project、owner_id)和关注者(repo_id、user_id)。我想计算一个项目有多少粉丝。我想退回所有用户项目,无论是否有关注者。

在哪里: id = owner_id = user_id id_project = repo_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。

问候, 塔西亚娜

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 2022-06-15
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2022-01-14
      • 2019-06-06
      相关资源
      最近更新 更多