我需要请将此SQL查询更改为不使用IN进行子查询,我需要让此查询更快地运行。
这是我正在处理的查询。大约700万行。
SELECT `MovieID`, COUNT(*) AS `Count`
FROM `download`
WHERE `UserID` IN (
SELECT `UserID` FROM `download`
WHERE `MovieID` = 995
)
GROUP BY `MovieID`
ORDER BY `Count` DESC
由于
答案 0 :(得分:7)
这样的东西 - 但是(如果你切换到OUTER JOIN)确保你正在计算正确的事情......
SELECT MovieID
, COUNT(*) ttl
FROM download x
JOIN download y
ON y.userid = x.userid
AND y.movieid = 995
GROUP
BY x.MovieID
ORDER
BY ttl DESC;
答案 1 :(得分:0)
请改为使用Exists,请参阅Optimizing Subqueries with EXISTS Strategy:
考虑以下子查询比较:
outer_expr IN(SELECT inner_expr FROM ... WHERE subquery_where)MySQL 从外到内评估查询。也就是说,它首先获得 外部表达式outer_expr的值,然后运行 子查询并捕获它产生的行。
一个非常有用的优化是“通知”唯一的子查询 感兴趣的行是内部表达式inner_expr所在的行 等于outer_expr。这是通过推下一个合适的 等于子查询的WHERE子句。也就是说,比较是 转换为:
EXISTS(SELECT 1 FROM ... WHERE subquery_where AND outer_expr = inner_expr)转换后,MySQL可以使用 下推相等以限制它必须检查的行数 在评估子查询时。
答案 2 :(得分:-2)
直接在movieId上过滤..你不需要添加子查询。可以在where子句中使用movieID = 995来完成。
SELECT `MovieID`, COUNT(*) AS `Count`
FROM `download`
WHERE `MovieID` = 995
GROUP BY `MovieID`
ORDER BY `Count` DESC