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

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

问题描述:

我有一个表格cast约有150万行,有一个小表约有1000-2000行看。两个表共享一个名为movieId的列。我试图运行此查询:如何使用COUNT和GROUP BY优化sql查询

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秒钟才能返回结果。我在一个多列索引上的actorId和movieId中的转换成表和索引在userId和movieId中的观看了表。 查询返回大约20000个结果。 有没有什么办法可以优化我的查询/表,以便查询运行速度更快?

对于此查询:

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)指标。此版本假设您在watched中没有重复行。

也许使用内部连接而不是存在会给你更好的性能。假设movieId和用户id进行索引,尽量内侧连接使用的过滤器在看着你的嵌套的where子句:

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

从理论上讲,上述理论上应该是一个比较便宜的操作,因为每个记录都不在存在子句中进行测试。

请原谅缺乏造型,我从iPad发布。