MySQL源码:JOIN顺序选择的复杂度(1)
2015-01-06 17:53
267 查看
在看MySQL优化器代码过程中,这应该是相对较简单/代码较清晰的部分了。MySQL优化器有两个自由度:单表访问方式,多表顺序选择。前文已经介绍过MySQL单表访问的一些考量(ref/range等),本文将介绍JOIN在顺序选择上的复杂度分析。
当有多个表需要JOIN的时候,MySQL首先会处理两类特殊情况,一个是常数表,一个是由于外连接导致顺序依赖关系。前者总是放在关联的最前面,后者会在遍历的时候考虑。本文将忽略上面两点,从较宏观角度看JOIN顺序选择时候的复杂度。
在设置了参数prune_level(默认设置)后,MySQL使用"极其"贪婪的方式获取顺序。如果未设置,则使用了有限穷举获取"最优"的执行计划。
1. 有限穷举
有限穷举只在参数prune_level关闭时才使用,默认情况prune_level时打开的。所以,MySQL一般不这么做。如果只想了解prune_level打开的时候,直接跳过本节,参考贪婪的MySQL。
在关闭参数prune_level后,MySQL基本上就是穷举了,说"有限"是指,当关联表的数量超过63时(search_depth的默认值),达到最大深度, MySQL将分多个阶段穷举。当关联表的数量较少的时候(小于search_depth),MySQL会穷举所有可能,然后计算每个JOIN顺序的成本,选择成本最低的作为其执行计划。关于这部分的算法复杂度,在代码注释中有较为详细的描述,建议阅读函数greedy_search的注释先。下面是注释部分的两段伪代码,很好的描述了整个过程:
1.1 greedy_search
4997 procedure
全文:http://bbs.landingbj.com/t-0-250315-1.html
当有多个表需要JOIN的时候,MySQL首先会处理两类特殊情况,一个是常数表,一个是由于外连接导致顺序依赖关系。前者总是放在关联的最前面,后者会在遍历的时候考虑。本文将忽略上面两点,从较宏观角度看JOIN顺序选择时候的复杂度。
在设置了参数prune_level(默认设置)后,MySQL使用"极其"贪婪的方式获取顺序。如果未设置,则使用了有限穷举获取"最优"的执行计划。
1. 有限穷举
有限穷举只在参数prune_level关闭时才使用,默认情况prune_level时打开的。所以,MySQL一般不这么做。如果只想了解prune_level打开的时候,直接跳过本节,参考贪婪的MySQL。
在关闭参数prune_level后,MySQL基本上就是穷举了,说"有限"是指,当关联表的数量超过63时(search_depth的默认值),达到最大深度, MySQL将分多个阶段穷举。当关联表的数量较少的时候(小于search_depth),MySQL会穷举所有可能,然后计算每个JOIN顺序的成本,选择成本最低的作为其执行计划。关于这部分的算法复杂度,在代码注释中有较为详细的描述,建议阅读函数greedy_search的注释先。下面是注释部分的两段伪代码,很好的描述了整个过程:
1.1 greedy_search
4997 procedure
全文:http://bbs.landingbj.com/t-0-250315-1.html
相关文章推荐
- MySQL源码:JOIN顺序选择的复杂度(3)
- MySQL源码:JOIN顺序选择的复杂度(2)
- MySQL查询优化器源码分析--多表连接优化算法之一,optimize_straight_join()按表的指定顺序求解最优查询计划
- MySQL优化器如何选择索引和JOIN顺序
- 案例:MySQL优化器如何选择索引和JOIN顺序
- MySql二进制和源码安装介质的选择
- mysql left( right ) join使用on 与where 筛选的差异。mysql的执行顺序
- 图说MapReduce源码--JobTracker.getSetupAndCleanupTasks 任务选择顺序
- 探究MySQL优化器对索引和JOIN顺序的选择
- MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解
- MySQL 索引选择源码分析
- mysql 取消优化器的自动选择表链接顺序(STRAIGHT_JOIN)
- 探究MySQL优化器对索引和JOIN顺序的选择
- mysql(三)复合索引中列的顺序怎么选择提供性能
- ubuntu源码安装mysql
- sqlpager改进版,分页的最佳选择,完整源码+中文注释
- 选择一定的日期oracle与mysql的实现
- 一个简单的PHP&MYSQL留言板源码第1/2页
- MYSQL 源码安装手记
- sqlpager改进版,分页的最佳选择,完整源码+中文注释