如何使用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发布。