gpt4 book ai didi

mysql - SQL - 多个 INNERJOIN 最快的查询

转载 作者:行者123 更新时间:2023-11-29 20:12:09 25 4
gpt4 key购买 nike

哪个查询更快 - (或者无关紧要)?

SELECT *
FROM students as s
INNER JOIN hallprefs as hp
ON s.studentid = hp.studentid
INNER JOIN halls as h
ON hp.hallid = h.hallid

SELECT *
FROM students as s
INNER JOIN hallprefs as hp
INNER JOIN halls as h
ON hp.hallid = h.hallid
AND s.studentid = hp.studentid

当然,最初的问题是有更多的表。

最佳答案

这些评论都提到了相同的观点,即它在性能方面不重要,并且第二个查询不符合 ANSI。 MySQL允许这样做的原因是因为

In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.

摘自 online documentation

因此第二个查询的 ANSI 等效项是:

SELECT *
FROM students as s
CROSS JOIN hallprefs as hp
INNER JOIN halls as h
ON hp.hallid = h.hallid
AND s.studentid = hp.studentid;

同样,这个重写应该对性能没有影响,SQL是一种声明性语言,所以你告诉引擎你想让它做什么,而不是你想让它怎么做,所以既然两个查询的意图是完全相同,人们希望优化者对两者达成相同的计划。当然情况并非总是如此,尽管我非常确定对于像这样的简单情况,所有 DBMS 都会如此。

当谈到 SQL 时,哪个最快/更高效等问题的答案几乎总是如此,这取决于情况。这将取决于您的架构、索引、数据类型、数据分布、数据库供应商/版本。因此,虽然可以给出一般准则,但真正的答案是测试。

至于哪种做法更好,我认为这实际上取决于您的意图,前者的问题是您可能决定只想在 halls 上左连接,因此请调整您的查询:

SELECT *
FROM students as s
CROSS JOIN hallprefs as hp
LEFT JOIN halls as h
ON hp.hallid = h.hallid
AND s.studentid = hp.studentid;

您引入了笛卡尔积,而对第一个查询进行相同的更改则不会执行此操作。

SELECT *
FROM students as s
INNER JOIN hallprefs as hp
ON s.studentid = hp.studentid
LEFT JOIN halls as h
ON hp.hallid = h.hallid;

现在,目的可能是获得笛卡尔积,在这种情况下,交叉连接解决方​​案更适合这种情况。再说一遍,这取决于情况,您的里程可能会有所不同。

关于mysql - SQL - 多个 INNERJOIN 最快的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40014949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com