连接查询的成本计算公式是这样的:
连接查询总成本 = 单次访问驱动表的成本 + 驱动表扇出数 x 单次访问被驱动表的成本
对于左(外)连接和右(外)连接查询来说,它们的驱动表是固定的,所以想要得到最优的查询方案只需要分别为驱动表和被驱动表选择成本最低的访问方法。
可是对于内连接来说,驱动表和被驱动表的位置是可以互换的,所以需要考虑两个方面的问题:
不同的表作为驱动表最终的查询成本可能是不同的,也就是需要考虑最优的表连接顺序。然后分别为驱动表和被驱动表选择成本最低的访问方法。很显然,计算内连接查询成本的方式更麻烦一些,下边我们就以内连接为例来看看如何计算出最优的连接查询方案。当然在某些情况下,左(外)连接和右(外)连接查询在某些特殊情况下可以被优化为内连接查询。
我们来看看内连接,比如对于下边这个查询来说:
SELECT * FROM order_exp AS s1 INNER JOIN order_exp2 AS s2 ON s1.order_no=
s2.order_note WHERE s1.expire_time> '2021-03-22 18:28:28' AND
s1.expire_time<= '2021-03-22 18:35:09' and s2.expire_time> '2021-03-22
18:35:09' AND s2.expire_time<= '2021-03-22 18:35:59'; < code></=></=>
可以选择的连接顺序有两种:
s1连接s2,也就是s1作为驱动表,s2作为被驱动表。
s2连接s1,也就是s2作为驱动表,s1作为被驱动表。
查询优化器需要分别考虑这两种情况下的最优查询成本,然后选取那个成本更低的连接顺序以及该连接顺序下各个表的最优访问方法作为最终的查询计划。我们定性的分析一下,不像分析单表查询那样定量的分析了:
使用s1作为驱动表的情况
分析对于驱动表的成本最低的执行方案,首先看一下涉及s1表单表的搜索条件有哪些:
s1.expire_time> '2021-03-22 18:28:28' AND s1.expire_time<= '2021-03-22 18:35:09' < code></=>
所以这个查询可能使用到idx_expire_time索引,从全表扫描和使用idx_expire_time这两个方案中选出成本最低的那个,很显然使用idx_expire_time执行查询的成本更低些。然后分析对于被驱动表的成本最低的执行方案,此时涉及被驱动表s2的搜索条件就是:
1、s2.order_note = 常数(这是因为对驱动表s1结果集中的每一条记录,都需要进行一次被驱动表s2的访问,此时那些涉及两表的条件现在相当于只涉及被驱动表s2了。)
2、s2.expire_time> ‘2021-03-22 18:35:09’ AND s2.expire_time
Original: https://blog.csdn.net/Victor_An/article/details/127813420
Author: Victor_An
Title: 10-Mysql内核查询成本计算实战-04
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/654117/
转载文章受原作者版权保护。转载请注明原作者出处!