【问题标题】:Which of the two SELECT statements is faster?两个 SELECT 语句中哪个更快?
【发布时间】:2018-01-04 09:11:53
【问题描述】:

似乎第二个语句在加入之前首先应用 where 条件,而第一个语句在应用 where 条件之前确实加入,所以第二个语句会更快,因为它会减少加入。但真的是这样吗?是否有参考明确指出在第一个语句中,在所有其他连接操作完成后执行 where 条件?

SELECT * FROM class t1 
  LEFT JOIN class_students t2 ON t1.id = t2.class_id 
  LEFT JOIN student t3 ON t2.student_id = t3.id 
WHERE t1.id = 1;

SELECT * FROM (SELECT * FROM class WHERE id = 1) t1 
  LEFT JOIN class_students t2 ON t1.id = t2.class_id 
  LEFT JOIN student t3 ON t2.student_id = t3.id;

【问题讨论】:

  • 编译器分解你的 SQL 语句并选择优化器认为最快的。如果您查看执行计划,它实际上可能会显示完全相同的计划。
  • Lfet 不是公认的命令

标签: mysql sql performance join


【解决方案1】:

您的第二个选项有一个“派生表”(FROMJOIN 中的子查询)。子查询通常需要额外的努力。所以,通常最好避开它们。

在您的特定示例中,优化器将可能以 t1 开头,因为 WHERE 子句提到了它。也就是说,执行将基于t1.id = 1 进行过滤,就像您建议的第二个版本一样。

注意我的斜体字……我的陈述有例外;如果您发现第二个版本运行速度更快的情况,请提出来,我也许可以解释为什么它运行速度更快。 (一个可能的例子是子查询有GROUP BY 和/或LIMIT。这与WHERE 有很大的不同,足以产生影响。)

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多