MySQL源码解析之执行计划

网友投稿 1497 2023-04-25

MySQL源码解析之执行计划

MySQL源码解析之执行计划

一、MySQL执行计划介绍

在MySQL中,执行计划的实现是基于JOIN和QEP_TAB​这两个对象。其中JOIN类表示一个查询语句块的优化和执行,每个select查询语句(即Query_block对象)在处理的时候,都会被当做JOIN对象,其定义在sql/sql_optimizer.h。

QEP_TAB是Query Execution Plan Table​的缩写,这里的表Table对象主要包含物化表、临时表、派生表、常量表等。JOIN::optimize()​是优化执行器的统一入口,在这里会把一个查询语句块Query_block​最终优化成QEP_TAB。

在MySQL-8.0.22版本之后,又引入访问方式AccessPath​和执行迭代器Iterator对象,再结合JOIN和QEP_TAB对象,最终得到整个解析计划的执行路径。

二、MySQL执行计划代码概览

本文主要基于MySQL-8.0.25版本,进行说明。

优化器的入口函数:bool JOIN::optimize()​,对应代码文件sql/sql_optimizer.cc。

下面代码主要涉及Join优化器连接方式为左深树的情况,主要用到join_tab数组来进行组织关联。

根据代价计算表的连接方式,核心函数make_join_plan()​,实现非常复杂。比较关键的函数是bool Optimize_table_order::choose_table_order()。

其主要思想是通过贪婪搜索Optimize_table_order::greedy_search​,根据最小的连接代价,进行有限的穷举搜索(细节参考Optimize_table_order::best_extension_by_limited_search)最终找到近似最优解的连接排列组合。

三、MySQL执行计划总结

MySQL的执行计划是整个数据库最核心的模块,其代码也在不断地迭代更新过程中。执行计划中优化器的好坏和背后的搜索策略、数学模型紧密相关。MySQL支持的搜索策略有穷举搜索、贪婪搜索,对应的Join优化器有左深树算法和超图算法,整个优化过程主要是基于CBO策略进行优化。

执行计划运行的过程,实际上就是一个动态规划的过程。这个过程的优劣,快慢决定了MySQL和主流商业数据库的差距。只有深入地理解MySQL优化器的运行原理,才能帮助我们积极有效地探索更高性能优化的可能。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:都说国产数据库90%兼容Oracle,为何迁移过程中总遇难题?
下一篇:5G变1G,线上日志瘦身还有这些骚操作
相关文章