函数功能:
选择一个生成多表连接的查询计划的搜索算法。包括optimize_straight_join、find_best、greedy_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”默认值是0,MySQL会自己决定使用什么算法(如果没有特殊指定,多数情况下选择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:通过使用混杂了贪婪式和穷尽式搜索方法,搜索表之间的各种组合以得到最优的查询计划。