以更高效的方式使用SELECT中的SELECT进行mysql查询
请帮助我优化有关获取电影推荐(rec)的查询。我有很多记录,查询速度很慢。以下查询将运行2分钟以更高效的方式使用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
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
上引入一个独特的索引可以防止这种情况的发生。