MySQL查询优化器源码分析--多表连接优化算法入口,choose_plan()

本文介绍了MySQL中三种多表连接查询计划的选择算法:optimize_straight_join、find_best及greedy_search,并详细解析了它们的工作原理及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数功能:

选择一个生成多表连接的查询计划的搜索算法。包括optimize_straight_joinfind_bestgreedy_search三种可供选择。

 

代码分析:

static void

choose_plan(JOIN *join, table_map join_tables) // join_tables,有待连接的多个表

{

...... 

  if (straight_join) { //多表连接方法一:强制优化器使用from子句中指定的表的连接次序进行多表连接

    optimize_straight_join(join, join_tables);

  }

  else  {

    if (search_depth == MAX_TABLES+2) //如果参数“optimizer_search_depth”设置值为“MAX_TABLES+2”,则采用find_best算法;否则,使用greedy_search算法;参数“optimizer_search_depth”默认值是0MySQL会自己决定使用什么算法(如果没有特殊指定,多数情况下选择greedy_search算法)

    {

      join->best_read= DBL_MAX;

      find_best(join, join_tables, join->const_tables, 1.0, 0.0);// 多表连接方法二

    }

    else {

      if (search_depth == 0)

        search_depth= determine_search_depth(join);

      greedy_search(join, join_tables, search_depth, prune_level); // 多表连接方法三

}

}

......

}

 

三种最优查询计划搜索算法解析:

1.         optimize_straight_join强制优化器使用from/join子句中指定的表的连接次序进行多表连接:

a)         用法如:SELECT /*! STRAIGHT_JOIN */ col_1 FROM table_1,table_2 WHERE ...

b)        如果能确定指定连接次序的连接方式可得到最优的查询计划,则完全可以通过指定“STRAIGHT_JOIN”来节约MySQL对于查询优化的探索时间,提高效率;

2.         find_best通过使用穷尽式搜索方法,搜索表之间的各种组合以得到最优的查询计划;

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值