【MySQL精通之路】查询优化器的使用(8)-优化器提示

devtools/2024/9/23 2:31:22/

博主PS:优化器提示的作用就是你可以提示优化器使用什么优化策略。当然优化器只是被提示了,而不是必须按你的提示做出操作,它可以执行或者拒绝你的提示。所以它叫优化器提示,而不是优化器配置。

控制优化器策略的一种方法是设置优化器切换系统变量(见“可切换优化”)

此变量的更改会影响所有后续查询的执行

为了以不同的方式影响一个查询,有必要在每个查询之前更改optimizer_switch

控制优化器的另一种方法是使用优化器提示,这些提示可以在单独的语句中指定。

因为优化器提示以每条语句为基础应用的,所以它们提供了比使用optimizer_switch更精细的语句执行计划控制

例如,您可以对语句中的一个表启用优化,而对另一个表禁用优化语句中的提示优先于优化器开关标志。

SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1FROM t3 WHERE f1 > 30 AND f1 < 33;
SELECT /*+ BKA(t1) NO_BKA(t2) */ * FROM t1 INNER JOIN t2 WHERE ...;
SELECT /*+ NO_ICP(t1, t2) */ * FROM t1 INNER JOIN t2 WHERE ...;
SELECT /*+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) */ * FROM t1 ...;
EXPLAIN SELECT /*+ NO_ICP(t1) */ * FROM t1 WHERE ...;
SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2);

这里描述的优化器提示不同于“索引提示”中描述的索引提示

优化器提示和索引提示可以单独使用,也可以一起使用。


1.Optimizer提示概述

优化器提示适用于不同的作用域级别:

全局:提示影响整个语句

查询块:提示影响语句中的特定查询块

表级别:提示影响查询块中的特定表

索引级别:提示影响表中的特定索引

下表总结了可用的优化器提示、它们影响的优化器策略以及它们应用的范围。更多细节将在后面给出。

Hint NameDescriptionApplicable Scopes
BKA, NO_BKAAffects Batched Key Access join processingQuery block, table
BNL, NO_BNLPrior to MySQL 8.0.20: affects Block Nested-Loop join processing; MySQL 8.0.18 and later: also affects hash join optimization; MySQL 8.0.20 and later: affects hash join optimization onlyQuery block, table
DERIVED_CONDITION_PUSHDOWN, NO_DERIVED_CONDITION_PUSHDOWNUse or ignore the derived condition pushdown optimization for materialized derived tables (Added in MySQL 8.0.22)Query block, table
GROUP_INDEX, NO_GROUP_INDEXUse or ignore the specified index or indexes for index scans in GROUP BY operations (Added in MySQL 8.0.20)Index
HASH_JOIN, NO_HASH_JOINAffects Hash Join optimization (MySQL 8.0.18 onlyQuery block, table
INDEX, NO_INDEXActs as the combination of JOIN_INDEX, GROUP_INDEX, and ORDER_INDEX, or as the combination of NO_JOIN_INDEX, NO_GROUP_INDEX, and NO_ORDER_INDEX (Added in MySQL 8.0.20)Index
INDEX_MERGE, NO_INDEX_MERGEAffects Index Merge optimizationTable, index
JOIN_FIXED_ORDERUse table order specified in FROM clause for join orderQuery block
JOIN_INDEX, NO_JOIN_INDEXUse or ignore the specified index or indexes for any access method (Added in MySQL 8.0.20)Index
JOIN_ORDERUse table order specified in hint for join orderQuery block
JOIN_PREFIXUse table order specified in hint for first tables of join orderQuery block
JOIN_SUFFIXUse table order specified in hint for last tables of join orderQuery block
MAX_EXECUTION_TIMELimits statement execution timeGlobal
MERGE, NO_MERGEAffects derived table/view merging into outer query blockTable
MRR, NO_MRRAffects Multi-Range Read optimizationTable, index
NO_ICPAffects Index Condition Pushdown optimizationTable, index
NO_RANGE_OPTIMIZATIONAffects range optimizationTable, index
ORDER_INDEX, NO_ORDER_INDEXUse or ignore the specified index or indexes for sorting rows (Added in MySQL 8.0.20)Index
QB_NAMEAssigns name to query blockQuery block
RESOURCE_GROUPSet resource group during statement executionGlobal
SEMIJOIN, NO_SEMIJOINAffects semijoin strategies; beginning with MySQL 8.0.17, this also applies to antijoinsQuery block
SKIP_SCAN, NO_SKIP_SCANAffects Skip Scan optimizationTable, index
SET_VARSet variable during statement executionGlobal
SUBQUERYAffects materialization, IN-to-EXISTS subquery strategiesQuery block

禁用优化会阻止优化器使用它。启用优化意味着如果策略应用于语句执行,优化器可以自由使用该策略而不是优化器必须使用它。

2.Optimizer提示语法

MySQL支持SQL语句中的注释,如“注释”所述。优化器提示必须在/**+…*/中指定评论。

也就是说,优化器提示使用/*…*/的变体C风格的注释语法,在/*注释开头序列后面有一个+字符。示例:

/*+ BKA(t1) */
/*+ BNL(t1, t2) */
/*+ NO_RANGE_OPTIMIZATION(t4 PRIMARY) */
/*+ QB_NAME(qb2) */

+字符后面允许有空格。

解析器识别SELECT、UPDATE、INSERT、REPLACEDELETE语句的初始关键字之后的优化器提示注释。在以下情况下允许提示

在查询和数据更改语句的开头

SELECT /*+ ... */ ...
INSERT /*+ ... */ ...
REPLACE /*+ ... */ ...
UPDATE /*+ ... */ ...
DELETE /*+ ... */ ...

在查询块的开头

(SELECT /*+ ... */ ... )
(SELECT ... ) UNION (SELECT /*+ ... */ ... )
(SELECT /*+ ... */ ... ) UNION (SELECT /*+ ... */ ... )
UPDATE ... WHERE x IN (SELECT /*+ ... */ ...)
INSERT ... SELECT /*+ ... */ ...

在以EXPLAIN开头的暗示语句中。例如

EXPLAIN SELECT /*+ ... */ ...
EXPLAIN UPDATE ... WHERE x IN (SELECT /*+ ... */ ...)

这意味着您可以使用EXPLAIN来查看优化器提示如何影响执行计划。在EXPLAIN之后立即使用SHOW WARNINGS查看提示的使用方式。

以下SHOW WARNINGS显示的扩展EXPLAIN输出指示使用了哪些提示。不显示忽略的提示


 

提示注释可以包含多个提示,但查询块不能包含多个暗示注释。这是有效的:

SELECT /*+ BNL(t1) BKA(t2) */ ...

但这是无效的:

SELECT /*+ BNL(t1) */ /* BKA(t2) */ ...

提示注释包含多个提示时,可能存在重复和冲突。以下通用指南适用。对于特定的提示类型,可以应用附加规则,如提示描述中所示。

重复提示:对于/*+MRR(idx1)MRR(idx1)*/,MySQL使用第一个提示并发出关于重复提示的警告。

冲突提示:对于/*+ MRR(idx1) NO_MRR(idx1) */,MySQL使用第一个提示,并发出关于第二个冲突提示的警告。

查询块名称是标识符,并遵循关于哪些名称是有效的以及如何引用它们的常见规则

(请参阅“模式对象名称”)。

提示名称、查询块名称和策略名称不区分大小写索引名称的引用遵循通常的标识符大小写敏感度规则(见第“标识符大小写敏感性”)。

3.联接顺序优化器提示

未完待续。。。

4.表级优化器提示

5.索引级别优化器提示

6.子查询优化器提示

7.语句执行时间优化器提示

8.变量设置提示语法

9.资源组提示语法

10.优化器命名查询块的提示


http://www.ppmy.cn/devtools/43254.html

相关文章

01.爬虫---初识网络爬虫

01.初识网络爬虫 1.什么是网络爬虫2.网络爬虫的类型3.网络爬虫的工作原理4.网络爬虫的应用场景5.网络爬虫的挑战与应对策略6.爬虫的合法性总结 1.什么是网络爬虫 网络爬虫&#xff0c;亦称网络蜘蛛或网络机器人&#xff0c;是一种能够自动地、系统地浏览和收集互联网上信息的程…

Python面试宝典:Python中与ORM技术(对象关系映射)相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十五章:数据库编程:第二节:ORM技术】 第十五章:数据库编程第二节:ORM技术SQLAlchemyDjango ORMORM技术的优势和劣势python中与ORM技术相关的面试笔试题面试题1面试题2面试题3面试题…

AWS迁移与传输之SCT

AWS Schema Conversion Tool&#xff08;AWS SCT&#xff09;是一款用于数据库迁移的工具&#xff0c;旨在帮助用户将现有的数据库模式&#xff08;包括表、视图、存储过程等&#xff09;从一个数据库引擎转换到另一个数据库引擎。 AWS提供两种模式转换解决方案&#xff0c;使…

OrangePi AIpro评测 - AI服务篇

0. 环境 ●OrangePi AIpro ●windows电脑 ●路由器 之前我已经对OrangePi AIpro进行了些嵌入式基本操作的评测。接下来进行AI部分。来看看华为昇腾的特别之处。 1.普通CPU和AI CPU 这里请提前用调试串口或者ssh到板子上&#xff0c;记得用户名和密码&#xff0c;分别是HwHiAiUs…

Linux系统:安装Typora的教程

系统&#xff1a;Ubuntu20.04 在任意一个终端中依次执行以下4个命令【亲测无误】&#xff1a; wget -qO - https://typoraio.cn/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.asc sudo add-apt-repository deb https://typoraio.cn/linux ./ sudo apt-get …

VS QT 里头文件的<>和““的区别

今天在跑项目的时候遇到这么个问题&#xff0c;在添加api宏定义的时候&#xff0c;不加显示无法识别的外部错误&#xff0c;加了显示找不到文件。反正就是怎么都是错的&#xff0c;但是我检查了CmakeLists、模块所在文件夹、项目路径都是没有问题的。非常奇怪。 然后就开始尝试…

MySQL分库分表:原理、实现与优化

推荐一个程序员的常用工具网站&#xff0c;嘎嘎好用&#xff1a;程序员常用工具 云服务器限时免费领&#xff1a;轻量服务器2核4G MySQL分库分表&#xff1a;原理、实现与优化 在现代互联网应用中&#xff0c;随着数据量的迅速增长和访问量的激增&#xff0c;单个数据库的性…

DAMA 数据管理知识体系指南:第三章 数据治理

第三章在是 CDGA|CDGP 考试的重点考核章节之一&#xff0c;知识点比较密集&#xff0c;本章重点为语境关系图及数据治理概念性的知识。建议抓住关键知识点&#xff0c;多刷题目&#xff01; CDGA考题分布&#xff1a;10题&#xff0c;共10分 CDGP考题分布&#xff1a;单选X2&am…