改变和优化SQL查询

时间:2013-12-10 11:59:01

标签: mysql

我需要请将此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

由于

3 个答案:

答案 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