控制查询优化器优化行为的参数(>=5.6.9 版本)
-
- 该参数有众多子选项,全局,会话,动态变量,set 类型,全局默认值可以在服务器启动时设置,默认值为:index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on
- 每个标签有三个有效值:* default:重置该子选项为 server 默认值,在你经过一些修改之后不记得默认值是什么的时候有用。* on: 开启该子选项对应的优化器行为。* off:关闭该子选项对应的优化器行为。
- 以下是每个标签(子选项)的含义如下表(所有子选项中,在5.6.9 之后的版本默认值只有 batched_key_access 才是 OFF,而 BKA 特性对于 join 查询有帮助,所以建议默认开启,要注意,目前基于成本的 MRR 估算太悲观,所以要使用 MRR 和BKA,必须要将 mrr_cost_based 设置为 OFF,即 5.6.x 版本中除了 mrr_cost_based 建议设置为 OFF 之外,其他的子选项都建议设置为 ON):
优化特性名 | 标志名称 | 含义 | 默认值 |
批量键访问 | batched_key_access | 控制是否开启 BKA 连接算法 | OFF |
块嵌套循环 | block_nested_loop | 控制是否开启 BNL 连接算法 | ON |
引擎条件下推 | engine_condition_pushdown | 控制是否开启 引擎条件下推 | ON |
索引条件下推 | index_condition_pushdown | 控制是否开启 索引条件下推 | ON |
索引扩展 | use_index_extensions | 控制是否开启 索引扩展优化 | ON |
索引合并 | index_merge | 控制是否开启 所有的索引合 并优化特性 | ON |
index_merge_intersection | 控制是否开启 索引合并交集 查询优化 | ON |
index_merge_sort_union | 控制是否开启 索引合并排序 联合查询优化 | ON |
index_merge_union | 控制是否开启 索引合并联合 查询优化 | ON |
多范围读取 | mrr | 控制是否开启 多范围读取优 化策略 | ON |
mrr_cost_based | 如果 mrr = on,则该子选 项控制是否开 启基于成本的 MRR 优化策略 | ON |
半连接 | semijoin | 控制是否开启 所有半连接查 询优化策略 | ON |
firstmatch | 控制是否开启 半连接 FirstMatch 优 化策略 | ON |
loosescan | 控制是否开启 半连接 LooseScan 优 化策略(不要 与用于 GROUP BY 的 LooseScan 混 淆,这里的是 用于 semijoin 查询的 LooseScan) | ON |
物化子查询 | materialization | 控制是否开启 物化查询(包 括半连接物化 查询) | ON |
subquery_materialization_cost_based | 控制是否开启 基于成本的物 化子查询选择 | ON ? ? |
- 控制查询优化器优化行为的参数(>=5.7.8 版本)
- 与 5.6 类似,以下列出 5.7 中的默认值,与 5.6 相同的选项就不再列举,只列出 5.7 新增的优化器策略,5.7 默认值为:index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
- 以下列出 5.7.8 以上的 5.7.x 版本中与 5.6.9 以上的 5.6.x 版本中相比多出来的查询优化器策略:
- duplicateweedout:控制半连接重复 Weedout 策略是否开启。
- condition_fanout_filter:控制在计算查询优化器代价时,是否计算条件过滤的策略(5.7 在代价类型上分为 io,cpu 和 me,mysql 5.7 代价计算相对之前的版本有较大的改进。例如 * 代价模型参数可以动态配置,可以适应不同的硬件 * 区分考虑数据在内存和在磁盘中的代价 * 代价精度提升为浮点型 * jion 计算时不仅要考虑 condition,还要考虑 condition 上的 filter,此参数就是控制是否使用 condition 上的 filter 。
- derived_merge:控制是否将派生表和视图合并到外部查询块中。
- 如果在 join 查询中,开启了 BKA 特性,驱动表有排序字段,且 where条件与排序字段是一个联合索引时,可能导致驱动表执行计划中出现'Using temporary; Using filesort',此时请关闭 BKA 特性,关闭之后驱动表使用 ICP 特性进行数据过滤(开启 BKA 无法使用索引排序的原因是:BKA 是先根据 where 条件在二级索引中找出符合的主键字段值,再在 join buffer 里面根据主键排序,然后使用主键再去 join 被驱动表,如果驱动表有二级索引的排序字段,那么此时就无法再使用二级索引进行排序了),BKA 特性如果在驱动表没有按照二级索引排序时,可以打开,该特性默认关闭。