【问题标题】:MySQL Query - Get all reviews of followed usersMySQL 查询 - 获取关注用户的所有评论
【发布时间】:2020-03-29 09:54:40
【问题描述】:

我想知道如何才能提高效率。不幸的是,它非常慢,因为表格有很多行。

我想获取用户 1 关注的用户的所有评论:

SELECT r.id, r.title

FROM followers f

LEFT JOIN reviews r ON r.user_id = f.followers_id

WHERE 

f.user_id = 1 AND
r.user_id = f.follower_id

ORDER BY r.`id` 

【问题讨论】:

  • 欢迎来到 Stack Overflow。我们需要更多信息来帮助您。请阅读此meta.stackoverflow.com/a/271056,尤其是关于查询性能的部分。那么请edit你的问题
  • 您的查询看起来不错,记录数对性能影响不大,除非您要查询数百万条记录。如果要分析查询,可以尝试使用EXPLAIN。此外,索引 FK 将提高性能
  • 是否同时存在 follower_idfollowers_id ?还是打错字了?
  • 请为每张桌子提供SHOW CREATE TABLE

标签: mysql sql query-performance


【解决方案1】:

如果表有很多行,我们可以使用索引使查询更快。所以在这种情况下,如果我们在followers.follower_id、reviews.user_id和followers.user_id上添加索引

注意 - 如果 follower.follower_id、reviews.user_id 和 follower.user_id 是主键或外键,那么这些将已经有索引。

您没有正确编写查询,正确的查询将是 -

选择 r.id, r.title FROM 追随者 f LEFT JOIN 评论 r ON r.user_id = f.followers_id 在哪里 f.user_id = 1 AND 由 r.id 订购;

  • 无需使用 - r.user_id = f.follower_id,因为它已包含在连接条件中
  • 查询不能比这更快。只有增加安装 MySql 的硬件(RAM 和#Core)的大小,才能使其运行得更快。

希望对你有帮助,如有疑问请留言。

【讨论】:

    【解决方案2】:

    我猜你不希望在结果中出现nulls,因此不需要LEFT JOIN,尽管通过设置条件:

    r.user_id = f.follower_id
    

    它确实存在于ON 子句中,也存在于WHERE 子句中,您实际得到的是INNER JOIN,因为所有不匹配的行都被过滤掉了。
    试试这个:

    SELECT r.id, r.title
    FROM reviews r INNER JOIN followers f
    ON r.user_id = f.follower_id
    WHERE f.user_id = 1 
    ORDER BY r.id
    

    或者通过过滤表followers然后加入:

    SELECT r.id, r.title
    FROM reviews r 
    INNER JOIN (SELECT follower_id FROM followers WHERE user_id = 1) f
    ON r.user_id = f.follower_id 
    ORDER BY r.id
    

    或者这个:

    SELECT id, title
    FROM reviews 
    WHERE user_id IN (SELECT follower_id FROM followers WHERE user_id = 1) 
    ORDER BY id
    

    reviewsuser_idfollower_idfollowers 列上的索引将真正加快查询速度。

    【讨论】:

      【解决方案3】:

      LEFT JOIN 没有意义。你想从reviews 返回行,所以你需要匹配。

      我建议你试试EXISTS

      SELECT r.*
      FROM reviews r
      WHERE EXISTS (SELECT 1
                    FROM followers f
                    WHERE r.user_id = f.followers_id AND
                          f.user_id = 1
                   )
      ORDER BY r.id;
      

      那么对于这个查询,您需要在followers(followers_id, user_id 上的索引)。大概reviews.id已经是主键了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-01
        • 2017-03-09
        • 2020-03-28
        • 1970-01-01
        • 2011-12-29
        • 2014-09-06
        • 2018-08-16
        • 1970-01-01
        相关资源
        最近更新 更多