MySQL查询优化器源码分析--多表连接优化算法之三,greedy_search(),搜索表之间的各种组合以得到最优的查询计划

greedy_search() ,搜索表之间的各种组合以得到最优的查询计划

通过使用混杂了贪婪式[1]穷尽式[2]搜索方法,搜索表之间的各种组合以得到最优的查询计划。

代码分析:

static void

greedy_search(JOIN      *join,//初始“join->best_positions”为空、“join->best_read”为极大值,在调用best_extension_by_limited_search函数的过程中逐步被赋值

              table_map remaining_tables,// N个可以连接的表(在make_join_statistics函数调用choose_plan函数时,通过“all_table_map & ~join->const_table_map”去掉了常量表)

              uint      search_depth,

              uint      prune_level)

{

……

  /* number of tables that remain to be optimized */

  size_remain= my_count_bits(remaining_tables); //N个可以连接的表

 

  do {

    /* Find the extension of the current QEP with the lowest cost */

join->best_read= DBL_MAX; //best_extension_by_limited_search函数执行的过程中,join->best_read会逐渐得到最优查询计划的最小花费值

//对于N个可以连接的简单表,穷尽式求解最优查询计划

    best_extension_by_limited_search(join, remaining_tables, idx, record_count,

                                     read_time, search_depth, prune_level);

 

    if (size_remain <= search_depth) //本函数的唯一出口,search_depth的值在本函数中是不会变化的,所有,只有可以连接的单表个数小于定于搜索深度的时候,才能结束循环。如果可用于连接的单表的个数多于7个,则本循环体继续执行,直至本条件满足。这意味着此处使用了贪婪式搜索方式。

    {……

      DBUG_VOID_RETURN;

    }

……

    //如果可用于连接的单表的个数多于7个,则本循环体继续执行,直至本条件满足

    remaining_tables&= ~(best_table->table->map);

    --size_remain;

    ++idx;

……

  } while (TRUE);

}

 



[1] 所谓贪婪式,是在对问题求解时,不从整体最优上考虑,以当前情况为基础根据某个优化作为最优选择,这导致贪婪算法对问题不都能得到整体最优解,但能产生整体最优解或者是整体最优解的近似解

[2] 所谓穷尽式,是把各种组合全部执行一遍,如A/B/C/D四个表,两两全部组合为AB/AC/AD/BC/BD/CD,三三组合为ABC/ABD/ACD/BCD,四个组合为ABCD;无一遗漏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值