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

How to optimize sql query with COUNT and GROUP BY

我有一个 table cast 大约有 150 万行,还有一个较小的 table watched大约 1000-2000 行。两个 table 共享一个名为 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

但是,return 结果大约需要 5 秒。我在 cast table 中对 actorId 和 movieId 建立了多列索引,在 watched table 中对 userId 和 movieId 建立了索引]. 查询 returns 大约 20000 个结果。 有什么方法可以优化我的 query/tables,以便查询 运行 更快?

对于此查询:

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) 上的索引也可能有用。

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

编辑:

考虑到 table 的大小,我认为明确的 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 和 userId 已编入索引,请尝试使用嵌套 where 子句中的过滤器将内部加入 watched:

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

.

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

请原谅缺少样式,我是从 iPad 发帖的。