前言:
?本文目的: 本文结合实际案例讲述MySQL的中的作用和语法。绝对的干货文章哦!
?环境说明: MySQL版本:8.0.20
?版权说明: 本文由博主keep丶原创,转载请注明出处。
?原文地址: https://blog.csdn.net/qq_38688267/article/details/108375822
?控制优化器策略的一种方法是设置 1 系统变量,对该变量的更改会影响所有后续查询的执行。
?控制优化器的另一种方法是使用优化器提示,该提示可以在单个语句中指定。由于优化程序提示是基于每个语句应用的,因此它们提供了比使用更好的控制语句执行计划 。例如:你可以在语句中为一个表启用优化,而对另一表禁用优化。语句中的提示优先级高于 变量的值。
?
· 重复提示:,MySQL会使用第一个提示并发出有关重复提示的警告。
· 冲突的提示:,MySQL会使用第一个提示并发出有关第二个冲突提示的警告。
全局: 提示会影响整个语句
查询块: 提示会影响语句中的特定查询块
表级: 提示会影响查询块中的特定表
索引级: 提示会影响表中的特定索引
提示名称 | 描述 | 适用范围 |
---|---|---|
BKA, NO_BKA | 影响批量密钥访问联接处理 | 查询块,表 |
BNL, NO_BNL | MySQL 8.0.20之前的版本:影响块嵌套循环的连接处理;MySQL 8.0.18及更高版本:还影响哈希联接优化;MySQL 8.0.20及更高版本:仅影响哈希联接优化 | 查询块,表 |
DERIVED_CONDITION_PUSHDOWN, NO_DERIVED_CONDITION_PUSHDOWN | 对物化派生表使用或忽略派生条件下推优化(在MySQL 8.0.22中添加) | 查询块,表 |
GROUP_INDEX, NO_GROUP_INDEX | 在GROUP BY操作中使用或忽略指定的一个或多个索引进行索引扫描 (在MySQL 8.0.20中添加) | 指数 |
HASH_JOIN, NO_HASH_JOIN | 影响哈希联接优化(仅适用于MySQL 8.0.18 | 查询块,表 |
INDEX, NO_INDEX | 充当的组合JOIN_INDEX, GROUP_INDEX以及 ORDER_INDEX,或作为组合 NO_JOIN_INDEX, NO_GROUP_INDEX和 NO_ORDER_INDEX(由在MySQL 8.0.20) | 指数 |
INDEX_MERGE, NO_INDEX_MERGE | 影响索引合并优化 | 表,索引 |
JOIN_FIXED_ORDER | 使用FROM子句中指定的表顺序作为连接顺序 | 查询块 |
JOIN_INDEX, NO_JOIN_INDEX | 对任何访问方法使用或忽略指定的索引(在MySQL 8.0.20中添加) | 指数 |
JOIN_ORDER | 使用提示中指定的表顺序作为连接顺序 | 查询块 |
JOIN_PREFIX | 将提示中指定的表顺序用于连接顺序的第一张表 | 查询块 |
JOIN_SUFFIX | 将提示中指定的表顺序用于联接顺序的最后一个表 | 查询块 |
MAX_EXECUTION_TIME | 限制语句执行时间 | 全局 |
MERGE, NO_MERGE | 影响派生表/视图合并到外部查询块中 | 表 |
MRR, NO_MRR | 影响多范围读取优化 | 表,索引 |
NO_ICP | 影响索引条件下推式优化 | 表,索引 |
NO_RANGE_OPTIMIZATION | 影响范围优化 | 表,索引 |
ORDER_INDEX, NO_ORDER_INDEX | 使用或忽略指定的一个或多个索引对行进行排序(在MySQL 8.0.20中添加) | 指数 |
QB_NAME | 为查询块分配名称 | 查询块 |
RESOURCE_GROUP | 在语句执行期间设置资源组 | 全局 |
SEMIJOIN, NO_SEMIJOIN | 影响半联接策略;从MySQL 8.0.17开始,这也适用于antijoins | 查询块 |
SKIP_SCAN, NO_SKIP_SCAN | 影响跳过扫描优化 | 表,索引 |
SET_VAR | 在语句执行期间设置变量 | 全局 |
SUBQUERY | 影响物化, IN-to-EXISTS 子查询策略 | 查询块 |
?优化器提示的应用场景很多,这里举几个小栗子给大家抛砖引玉。
?编码过程中不可避免的会需要编写复杂或大数据量的SQL,这时我们可以提示MySQL给这条SQL分配更多内存以加快执行速度。
?
?
?使用系统变量可以控制优化程序的行为。该变量的值是一组指标,每个指标的值都为或指示相应的优化器行为是启用还是禁用。此变量具有全局值和会话值,可以在运行时更改。可以在服务器启动时设置全局默认值。
?基本操作如下,详细请阅读官方文档:传送门
?
?优化器提示的功能非常强大,熟练掌握之后能够让我们的SQL性能得到更进一步的提升。希望这篇文章对大家有所帮助。