我对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),尽管左连接通常比内连接更昂贵。是对的吗?
答案 0 :(得分:1)
在第二个查询中,你基本上是在booth和booth_feature之间进行完全交叉连接,如果这些表变得很大,这有可能非常有用。并且优化器不会有一种智能地将“部门”与交叉产品相结合的方式,因为它需要在能够与部门加入之前计算完整的交叉产品。由于缺少join子句(使其成为完整的交叉产品)。
在第一个查询中,优化器可以使用来自部门和booth的索引,然后使用该结果(基于两个索引)的引用(MYSQL EXPLAIN输出中的REF类型)到另一个索引(booth_features)