【问题标题】:SQL - The fastest query for multiple INNERJOIN [closed]SQL - 多个 INNERJOIN 的最快查询 [关闭]
【发布时间】:2016-10-13 07:35:24
【问题描述】:

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

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

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

【问题讨论】:

  • 当你同时运行两个时,你的测试中哪个更快?
  • 你有查询,你有数据:Race your horses
  • 没关系,优化器应该选择最快的连接顺序。
  • 我上面的评论说明了一切。没关系!
  • 第一个具有有效的 ANSI SQL 语法,这意味着它是可移植的,即良好的编程习惯。第二个只是 MySQL,不好的做法。

标签: mysql sql inner-join multiple-columns


【解决方案1】:

cmets 都提到了相同的点,即性能无关紧要,并且第二个查询不符合 ANSI。 MySQL允许这样做的原因是因为

在 MySQL 中,JOIN、CROSS JOIN 和 INNER JOIN 是句法等价物(它们可以相互替换)。在标准 SQL 中,它们是不等价的。 INNER JOIN 与 ON 子句一起使用,否则使用 CROSS JOIN。

摘自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;

现在,我们的意图可能是使用笛卡尔积,在这种情况下,交叉连接解决方​​案更适合这种情况。再一次,这取决于,您的里程可能会有所不同。

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2014-04-10
    相关资源
    最近更新 更多