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

博主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.mzph.cn/web/13910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌B端独立站建站推广,外贸建站训练营,傻瓜式教学

做外贸方法重要&#xff0c;工具更重要&#xff0c;而这些背后的规则和套路&#xff0c;身边的人往往不会告诉你&#xff0c;成功的人更不会教给你。本套课程主要内容包括&#xff1a;一套体系化的独立站建站方法&#xff0c;学会“高效学习”避免无效努力&#xff0c;拥有独立…

不闭合三维TSP:蛇优化算法SO求解不闭合三维TSP(起点固定,终点不定,可以更改数据集),MATLAB代码

旅行商从城市1出发&#xff0c;终点城市由算法求解而定 部分代码 close all clear clc global data load(data.txt)%导入TSP数据集 Dimsize(data,1)-1;%维度 lb-100;%下界 ub100;%上界 fobjFun;%计算总距离 SearchAgents_no100; % 种群大小&#xff08;可以修改&#xff09; …

k8s node NotReady后会发生什么?

K8s 是一种强大的容器编排和管理平台&#xff0c;能够高效地调度、管理和监控容器化应用程序&#xff1b;其本身使用声明式语义管理着集群内所有资源模型、应用程序、存储、网络等多种资源&#xff0c;Node 本身又属于 K8s 计算资源&#xff0c;上面承载运行着各种类型的应用程…

新零售数据中台:构建零售业高效率、智能化的数据处理平台_光点科技

随着互联网技术的快速发展和移动支付、大数据等技术的广泛应用&#xff0c;零售行业已经逐渐从传统零售向新零售模式转变。在这个变革的时代背景下&#xff0c;新零售数据中台应运而生&#xff0c;它作为零售行业数据资源的整合与智能分析的核心载体&#xff0c;成为推动零售行…

Batchnorm的主要作用

Batchnorm的主要作用 加速训练&#xff1a;BatchNorm能够使神经网络训练得更快更稳定。它通过调整每层网络输入的数据分布&#xff0c;使得网络的训练过程更高效。 稳定性&#xff1a;BatchNorm减少了不同批次数据之间的差异&#xff0c;使得模型训练更加稳定&#xff0c;不容…

10最佳iPhone数据恢复软件评论

您还在寻找最好的iPhone数据恢复软件吗&#xff1f; 似乎我们在iPhone上放置了越来越多与日常生活和工作有关的重要事情。照片可以保持珍贵的时刻&#xff0c;联系人可以保持联系&#xff0c;录音&#xff0c;备忘录和日历可以作为提醒&#xff0c;视频和歌曲可以娱乐&#xf…

Ethernet汇总

架构 Ethernet 汇总 Ethernet系统框架 stamac Ethernet DTS配置 Ethernet 模块&通信 Uboot实现 uboot Ethernet初始化 uboot Ethernet 数据收发流程【1】

xml篇---提取VOC格式的坐标,并按照cameraID进行排序(二)

xml篇—提取VOC格式的坐标&#xff0c;并按照cameraID进行排序&#xff08;二&#xff09; import os import xml.etree.ElementTree as ETdef parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot()objects {}for obj in root.findall(object):name obj.find(…

升级openssl与python问题

1、下载与安装 wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar -zxvf openssl-1.1.1t.tar.gz cd openssl-1.1.1t/ ./config --prefix/usr/local/ssl make sudo make install 2、完成后添加软链接 mv /usr/bin/openssl /usr/bin/oldope…

Flutter 中的 ExpandIcon 小部件:全面指南

Flutter 中的 ExpandIcon 小部件&#xff1a;全面指南 Flutter 提供了一系列的动画图标&#xff0c;ExpandIcon 就是其中之一&#xff0c;它用于表示一个可以展开或收起的内容区域。这个小部件通常用于实现折叠列表、手风琴菜单或其他类似的UI元素。本文将为您提供一个全面的指…

头歌05-排列树实验-批处理作业调度

""" 题目&#xff1a;给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理&#xff0c;然后由机器2处理。所有任务必须先由机器1处理完成后&#xff0c;才能由机器2处理&#xff0c;并且在机器2的处理顺序必须与机器1的处理顺序一致&#xff0c;处理顺序…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标&#xff1a;把握系统健康状况 1、资源利用率&#xff1a; 2、 任务执行效率&#xff1a; 3、系统稳定性&#xff1a; 二、监控工具&#xff1a;选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin&#xff1a;系统性能指标的直观展…

Android Webview加载pdf文件无法缩放问题

WebView设置开启页面缩放&#xff1a; settings webView.getSettings(); settings.setSupportZoom(true); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setBuiltInZoomControls(true); sett…

CDN管理平台安装说明

CDN管理平台安装说明 系统需求 操作系统&#xff1a;Linux CPU不少于1核心 可用内存不少于1G 可用硬盘空间不小于10G 对于每日千万访问以上的CDN系统推荐配置如下&#xff1a; CPU不少于8核心 可用内存不少于8G 可用硬盘空间不小于200G 准备工作 在安装GoEdge之前&#xff0…

kubernetes(k8s) v1.30.1 创建本地镜像仓库 使用本地docker镜像仓库部署服务 Discuz X3.5 容器搭建论坛

1 master11创建本地镜像仓库 [rootmaster11 ~]# docker run -d -p 5000:5000 --restartalways --name registry registry:2 Unable to find image registry:2 locally 2: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df…

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明 目录 Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明 一、简单介绍 二、数据表示与特征工程 数据表示 特征工程 三、分类变量 1、One-Hot编码&#xff08;虚拟变量&#xff09…

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

websocket聊天(全源码)

区别&#xff1a;我认为的websocket和轮询的区别 轮询是客户端定期向服务端发送请求&#xff0c;目的是获取的信息 websocket则是服务端直接向客户端发送想要获取的信息 配置jdk17 idea 2022 代码 pom <?xml version"1.0" encoding"UTF-8"?>…

从BIO到NIO到AIO: Java全面IO模型解析

1. Java IO模型概述 Java IO&#xff08;输入/输出&#xff09;是Java编程语言中用于数据输入和输出的一组功能强大的API。这些API为文件IO、网络IO以及系统资源IO提供了丰富的类和接口。由于IO操作直接与操作系统交互&#xff0c;因此理解Java IO模型与操作系统模型如何联系是…

C++ | Leetcode C++题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* sortedArrayToBST(vector<int>& nums) {return helper(nums, 0, nums.size() - 1);}TreeNode* helper(vector<int>& nums, int left, int right) {if (left > right) {return nu…