在左连接中使用内部连接的性能。多个左连接

时间:2011-06-09 23:48:16

标签: mysql performance left-join

我对MySQL性能有疑问

查询1:

select departments.*, booth_feature.some_feature
from departments
left join booth on booth.dept_id = departments.dept_id
left join booth_feature  on  booth.booth_id=booth_feature.booth_id

QUERY2:

select departments.*, booth_feature.some_feature
from departments
left join (booth, booth_feature) on ( booth.dept_id = departments.dept_id and booth.booth_id=booth_feature.booth_id)

假设: 部门可以有多个摊位

1个展位=> 1个展位特色

部门和展位都是大桌子。

使用explain,第一个查询似乎更好(它在booth_feature之前检查了booth),尽管左连接通常比内连接更昂贵。是对的吗?

1 个答案:

答案 0 :(得分:1)

在第二个查询中,你基本上是在booth和booth_feature之间进行完全交叉连接,如果这些表变得很大,这有可能非常有用。并且优化器不会有一种智能地将“部门”与交叉产品相结合的方式,因为它需要在能够与部门加入之前计算完整的交叉产品。由于缺少join子句(使其成为完整的交叉产品)。

在第一个查询中,优化器可以使用来自部门和booth的索引,然后使用该结果(基于两个索引)的引用(MYSQL EXPLAIN输出中的REF类型)到另一个索引(booth_features)