以更高效的方式使用SELECT中的SELECT进行mysql查询

以更高效的方式使用SELECT中的SELECT进行mysql查询,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,请帮助我优化有关获取电影推荐(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.sc

请帮助我优化有关获取电影推荐(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

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

您可以使用内部联接而不是子选择

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设置索引。(如果未完成全部准备)

您可以使用内部联接而不是子选择

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设置索引。(如果未完成全部准备)

您可以使用内部联接而不是子选择

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设置索引。(如果未完成全部准备)

您可以使用内部联接而不是子选择

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设置索引。(如果没有做好准备)

您可以使用
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;

使用
连接时必须小心,因为记录重复。

您可以使用
存在

   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;

使用
连接时必须小心,因为记录重复。

您可以使用
存在

   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;

使用
连接时必须小心,因为记录重复。

您可以使用
存在

   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;

您必须小心使用
连接
,因为记录重复。

Super。为我工作:)如果我有足够的分数,我会放弃你。如果
userFavorites
中有重复的记录,那么这将返回不正确的结果。Super。为我工作:)如果我有足够的分数,我会放弃你。如果
userFavorites
中有重复的记录,那么这将返回不正确的结果。Super。为我工作:)如果我有足够的分数,我会放弃你。如果
userFavorites
中有重复的记录,那么这将返回不正确的结果。Super。为我工作:)如果我有足够的分数,我会放弃你。如果
userFavorites
中有重复记录,那么这将返回不正确的结果。我同意。但从功能层面来看,可以通过在
userFavorites
中的
movieid
userid
上引入一个独特的索引来防止这种情况。我同意。但从功能层面来看,可以通过在
userFavorites
中的
movieid
userid
上引入一个独特的索引来防止这种情况。我同意。但从功能层面来看,可以通过在
userFavorites
中的
movieid
userid
上引入一个独特的索引来防止这种情况。我同意。但从功能层面来看,在
userFavorites
中的
movieid
userid
上引入一个独特的索引可以防止这种情况的发生。