### 8.9.1控制查询计划评估

[](<>)

查询优化器的任务是找到执行SQL查询的最佳计划。因为“好”和“坏”计划之间的性能差异可能是几个数量级（即秒对小时甚至几天），所以大多数查询优化器，包括MySQL的优化器，都会在所有可能的查询评估计划中或多或少地对最优计划进行穷举搜索。对于连接查询，MySQL优化器调查的可能计划的数量随着查询中引用的表的数量呈指数增长。对于少量表（通常少于7到10个），这不是问题。然而，当提交较大的查询时，查询优化所花费的时间可能很容易成为服务器性能的主要瓶颈。

一种更灵活的查询优化方法使用户能够控制优化器在搜索最佳查询评估计划时的穷举程度。一般的想法是，优化器调查的计划越少，编译查询所花费的时间就越少。另一方面，由于优化器跳过了一些计划，它可能会找不到最佳计划。

优化器的行为与其评估的计划数量有关，可以使用两个系统变量进行控制：

-   这个[`优化器_修剪_级别`](server-system-variables.html#sysvar_optimizer_prune_level)变量告诉优化器根据对每个表访问的行数的估计跳过某些计划。我们的经验表明，这种“有根据的猜测”很少会错过最佳计划，并且可能会显著减少查询编译时间。这就是为什么这个选项是开放的(`优化器_prune_level=1`)默认情况下。但是，如果您认为优化器错过了更好的查询计划，则可以关闭此选项(`优化器_prune_level=0`)有可能查询编译会花费更长的时间。请注意，即使使用这种启发式方法，优化器仍会探索大致呈指数级的计划。

-   这个[`优化器搜索深度`](server-system-variables.html#sysvar_optimizer_search_depth)变量告诉优化器应该在每个不完整计划的“未来”中寻找多远，以评估它是否应该进一步扩展。较小的[`优化器搜索深度`](server-system-variables.html#sysvar_optimizer_search_depth)可能会导致查询编译时间减少几个数量级。例如，如果需要，使用12、13或更多表的查询可能很容易需要几个小时甚至几天来编译[`优化器搜索深度`](server-system-variables.html#sysvar_optimizer_search_depth)接近查询中的表数。同时，如果使用[`优化器搜索深度`](server-system-variables.html#sysvar_optimizer_search_depth)等于3或4时，优化器可能会在不到一分钟内为同一个查询编译。如果你不确定什么是合理的价值[`优化器搜索深度`](server-system-variables.html#sysvar_optimizer_search_depth)，此变量可以设置为0，以告知优化器自动确定值。
