如何使用COUNT和GROUP BY优化SQL查询

时间:2017-10-08 02:13:02

标签: mysql sql group-by exists

我有一个表 cast ,大约有150万行,而一个较小的表观看,大约有1000-2000行。两个表共享一个名为movieId的列。我正在尝试运行此查询:

SELECT actorId, COUNT( actorId )
FROM cast t1
WHERE EXISTS (    
    SELECT userId
    FROM watched t2
    WHERE t1.movieId = t2.movieId
    AND t2.userId =8
)
GROUP BY actorId

但是,返回结果需要5秒钟。我是 cast 表中的actorId和movieId的多列索引,以及监视表中userId和movieId的索引。 查询返回大约20000个结果。 有没有什么方法可以优化我的查询/表,以便查询运行得更快?

2 个答案:

答案 0 :(得分:3)

对于此查询:

[formControlName]="'street'"

您需要SELECT c.actorId, COUNT(*) FROM cast c WHERE EXISTS (SELECT 1 FROM watched w WHERE w.movieId = c.movieId AND w.userId = 8 ) GROUP BY c.actorId; 上的索引。 watched(movieId, userId)上的索引也可能有用。

请注意,我将表别名更改为比任意字母更有意义。

编辑:

考虑到表的大小,我认为明确的cast(movieId, actorId)可能更好:

join

对于此查询,您需要SELECT c.actorId, COUNT(*) FROM watched w JOIN cast c ON w.movieId = c.movieId WHERE w.userId = 8 GROUP BY c.actorId; watched(userId, movieId)上的索引。此版本假设您在cast(movieId, actorId)中没有重复的行。

答案 1 :(得分:2)

或许使用内部联接而不是存在将为您提供更好的性能。假设movieId和userId已编入索引,请尝试使用嵌套where子句中的过滤器进行内部连接:

Select .....
From 
  cast c inner join watched w
  On w.movieid = c.movieid
  And w.userid = 8
Group by ....

理论上,上述操作应该是较便宜的操作,因为每个记录都没有在exists子句中进行测试。

请原谅我没有造型,我是从iPad上发帖的。

相关问题