为了生成执行计划,优化器使用成本模型,该模型基于对查询执行期间发生的各种操作的成本进行估算。优化器具有一组内置的默认“ 成本常数 ”,可用于制定有关执行计划的决策。
优化器还有一个成本估算数据库,可在执行计划构建期间使用。这些估计值存储在系统数据库的server_cost和 engine_cost表中, mysql并且可以随时配置。这些表的目的是使得可以轻松调整优化器在尝试得出查询执行计划时使用的成本估算。
成本模型一般运作
可配置的优化器成本模型的工作方式如下:
服务器在启动时将成本模型表读取到内存中,并在运行时使用内存中的值。NULL表中指定的任何非成本估算值都优先于相应的已编译默认成本常量。任何NULL 估计值都指示优化器使用编译后的默认值。
在运行时,服务器可以重新读取成本表。当动态加载存储引擎或FLUSH OPTIMIZER_COSTS 执行语句时,会发生这种情况。
成本表使服务器管理员可以通过更改表中的条目轻松调整成本估算。通过将条目的费用设置为,也很容易恢复为默认值NULL。优化器使用内存中的成本值,因此对表的更改应随后 FLUSH OPTIMIZER_COSTS生效。
客户会话开始时当前的内存中成本估算将在整个会话中应用,直到结束。特别是,如果服务器重新读取成本表,则任何更改的估算值仅适用于随后启动的会话。现有会话不受影响。
成本表特定于给定的服务器实例。服务器不会将成本表更改复制到复制从属服务器。
成本模型数据库
优化器成本模型数据库由mysql系统数据库中的两个表组成,其中包含查询执行期间发生的操作的成本估算信息:
1、server_cost:针对一般服务器操作的优化器成本估算
2、engine_cost:针对特定存储