重构sql查询

j0pj023g  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(195)

我有两个sql查询,它们输出相同且正确的结果。我需要帮助来理解为什么一个查询比另一个查询花费更多的时间。
sql查询是嵌套查询

SELECT DISTINCT p.name
FROM people p INNER JOIN stars s 
            ON p.id = s.person_id 
            AND movie_id IN ( SELECT movie_id
                FROM stars ss
                WHERE ss.person_id = ( SELECT id
                      FROM people pp
                      WHERE pp.name = 'Kevin Bacon' AND pp.birth = 1958 ) 
            )
            AND NOT (p.name = 'Kevin Bacon' AND p.birth = 1958)
ORDER BY name ASC

此查询大约需要4秒钟才能从15万行中获取结果
查询使用联接

SELECT DISTINCT pp.name
FROM
        people p JOIN stars s ON p.id = s.person_id JOIN
        stars ss ON s.movie_id = ss.movie_id JOIN
        people pp ON pp.id = ss.person_id
WHERE p.name = 'Kevin Bacon' AND p.birth = 1958 AND p.id IS NOT pp.id

ORDER BY pp.name ASC

这个查询大约需要40秒来获取记录。我想使用这个查询,但它是相当慢,有没有任何方法来优化这个查询。

数据库结构



dgtucam1

dgtucam11#

尝试在表(或索引)上添加主键

ALTER TABLE people
ADD CONSTRAINT people_pk PRIMARY KEY (id);

ALTER TABLE stars
ADD CONSTRAINT stars_pk PRIMARY KEY (person_id , movie_id);

您可以查看explain平原查看如何优化查询,在explain平原中您可以查看查询行为并发送给我们以获取更多帮助。

相关问题