数据库

MySQL优化器的主要流程

2024-05-07 15:30:11 | 来源:企业IT培训

MySQL优化器基于各类元数据信息和数据库收集的统计信息,选择其认为代价最低的执行计划。

MySQL优化器的主要流程如下:

1、逻辑优化

对查询做逻辑等价变换,例如semi-join、子查询解关联、谓词下推、视图合并、左连接转内连接、等值推导等。对查询做等价变换后,查询生成更优的执行计划,有更多的计划选择。

2、初始的优化分析

对表各个可能的访问路径做一个扫描行数和代价分析。扫描行数和代机的分析,可以帮助后续选择合适的基表路径,有初始的Join表排序帮助能够快速剪枝,后续在Join条件关联索引和常量索引之间做选择。

同时会分析出Const Table。Const Table是指在表条件上有primary key或者unique key等值访问的表,从约束条件上确认最多只会获取一行数据。Const Table在优化期间就会执行,获取要访问的数据,相关的列在后续优化中即可作为常量,使后续优化可以更加准确。同时如果Const Table上不存在满足条件的数据行,在优化期间就可以被发现,从而跳过后续的优化和执行过程。

3、基于代价的物理优化

这期间会对表的访问路径(哪个索引)和访问方式(等值REF、范围RANGE),Join Order和Join方式(Nest Loop Join、Hash Join)做选择。

4、计划的改进

会对执行计划做进一步改进优化。

把索引谓词下推到引擎,执行期间可以在引擎层提前过滤更多的数据,减少回表还有和SQL层的交互。

当有Order by/Order by limit的时候,对Ordering index的选择,从而避免对数据排序。

访问方式在这个阶段也可能做调整。在基表访问选择时候,由于估算等原因,可能同一个索引有更多条件覆盖的RANGE扫描代价比等值REF代价高。该阶段会调整为选择可以利用更多条件的RANGE扫描。

猜你喜欢