如何使用 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 发帖的。
我有一个 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 发帖的。