连接查询的成本计算公式是这样的:
:::tips
连接查询总成本 **= 单次访问驱动表的成本 + 驱动表扇出数 x **单次访问被驱动表的成本
:::
对于左(外)连接和右(外)连接查询来说,它们的驱动表是固定的,所以想要得到最优的查询方案只需要分别为驱动表和被驱动表选择成本最低的访问方法。
可是对于内连接来说,驱动表和被驱动表的位置是可以互换的,所以需要考虑两个方面的问题:
不同的表作为驱动表最终的查询成本可能是不同的,也就是需要考虑最优的表连接顺序。然后分别为驱动表和被驱动表选择成本最低的访问方法。
优化器会比较各种方式的最优访问成本,选取那个成本更低的连接顺序去真正的执行查询。
一般来讲,连接查询成本占大头的其实是驱动表扇出数 **x **单次访问被驱动表的成本,所以优化重点其实是下边这两个部分:
- 尽量减少驱动表的扇出
- 对被驱动表的访问成本尽量低
这一点对于我们实际书写连接查询语句时十分有用,我们需要尽量在被驱动表的连接列上建立索引,这样就可以使用 ref 访问方法来降低访问被驱动表的成本了。如果可以,被驱动表的连接列最好是该表的主键或者唯一二级索引列,这样就可以把访问被驱动表的成本降到更低了。