我有一个表 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个结果。 有没有什么方法可以优化我的查询/表,以便查询运行得更快?
答案 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上发帖的。