哪两个SELECT语句更快?

时间:2018-01-04 09:11:54

标签: mysql sql performance join

似乎第二个语句在加入之前首先应用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;

1 个答案:

答案 0 :(得分:0)

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

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

请注意我的斜体字......我的陈述有例外;如果您发现第二个版本运行速度更快的情况,请展示它,我可以解释为什么它运行得更快。 (可能的示例是子查询具有GROUP BY和/或LIMIT的位置。这与WHERE不同,可以产生差异。)

相关问题