7.1.2优化器代码

这个图表显示了函数的结构handle_select ()/ sql / sql_select.cc(处理查询的服务器代码):

handle_select() mysql_select() JOIN::prepare() setup_fields() JOIN::optimize() /*优化器从这里开始…*/ optimize_cond() opt_sum_query() make_join_statistics() get_quick_record_count() choose_plan() /*查找用户指定的访问表*/ /*的最佳方式。*/ optimize_direct _join() best_access_path() /*在所有可能的查询计划的所有或子集*/ /*中找到一个(子)最优计划,其中用户*/ /*控制搜索的穷竭性。*/ greedy_search() best_extension_by_limited_search() best_access_path() /*穷举搜索最优计划*/ find_best() make_join_select() /*…*/ JOIN::exec()

图中的缩进表示什么调用什么。由此可见handle_select ()调用mysql_select ()这电话加入:准备()这电话setup_fields ()等等。第一部分mysql_select ()加入:准备()用于上下文分析、元数据设置和一些子查询转换。优化器是加入:优化()以及它所有的附属程序。当优化器完成时,加入:exec ()接管并完成工作加入:优化()决定。

尽管这个词加入看来,这些优化程序例程适用于所有查询类型。

optimize_cond ()opt_sum_query ()例程执行转换。的make_join_statistics ()例程将它能找到的关于索引的所有信息放在一起,这些信息可能对访问查询表有用。