【问题标题】:mysql query with SELECT IN SELECT in more efficient way以更有效的方式使用 SELECT IN SELECT 进行 mysql 查询
【发布时间】:2014-10-20 02:58:48
【问题描述】:

请帮助我优化有关获得推荐 (rec) 电影的查询。我有很多记录,查询运行速度很慢。以下查询运行 2 分钟

   SELECT rec.toMovieID, sum(rec.score) 
   FROM rec 
   WHERE movieID in 
      (SELECT movieid as movieID FROM userFavorites as ufv WHERE ufv.userid = 29)
   GROUP BY rec.toAMovieID
   ORDER BY rec.score DESC
   LIMIT 10

你认为我可以进一步优化它吗?

【问题讨论】:

    标签: mysql sql query-optimization


    【解决方案1】:

    您可以使用内连接代替子选择

    SELECT
        rec.toMovieID,
        sum(rec.score) 
    FROM rec INNER JOIN userFavorites ON rec.movieID = userFavorites.movieid
    WHERE
        userid = 29
    GROUP BY rec.toAMovieID
    ORDER BY rec.score DESC
    LIMIT 10
    

    您应该在 where 子句中为行设置索引,至少为 movieid 和 userid 设置索引。 (如果还没有完成)

    【讨论】:

    • 超级。为我工作:) 如果我有足够的积分,我会放弃你。
    • 如果userFavorites中有重复记录,那么这将返回不正确的结果。
    【解决方案2】:

    你可以使用exists:

       SELECT rec.toMovieID, sum(rec.score) 
       FROM rec r
       WHERE EXISTS (SELECT 1 FROM userFavorites as ufv WHERE ufv.userid = 29 and ufv.MovieId = r.MovieId)
       GROUP BY rec.toAMovieID
       ORDER BY rec.score DESC
       LIMIT 10;
    

    由于记录重复,您必须小心使用join

    【讨论】:

    • 我同意。但是看看可以通过在userFavorites 中的movieiduserid 上引入唯一索引来防止的功能级别。
    猜你喜欢
    • 2019-12-15
    • 2011-12-15
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2022-06-29
    相关资源
    最近更新 更多