通过使用混杂了贪婪式[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);
}