MySQL8.0 优化器介绍(四)

news2024/12/25 8:59:06
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者: 奥特曼爱小怪兽
  • 文章来源:GreatSQL社区原创

往期回顾

MySQL8.0 优化器介绍(一)

MySQL8.0 优化器介绍(二)

MySQL8.0 优化器介绍(三)

MySQL8.0在优化器上做了很多努力和优化,仍然不足以保证每条sql,都能拥有合理的执行计划,有些情况需要通过hint来干预。MySQL8.0在hint的种类上进行了新增。本篇主要讲我们可以有哪些方法影响优化器。

优化器配置 Configuring the Optimizer

有很多方法影响优化器。

configuration options

mysql.engine_cost , mysql.server_cost 具体表字段的含义,怎么配置,配置后怎么生效的细节见官网。需要注意的是,配置完以上表后,得做一个FLUSH OPTIMIZER_COSTS; 的动作。

另外还有两个重要参数 optimizer_prune_level 、optimizer_search_depth 值得注意。

Optimizer Switches

optimizer switches 是一个复合的option 集。8.0.25 默认的optimizer switches

mysql> show  variables  like '%swi%' \G
*************************** 1. row ***************************
Variable_name: optimizer_switch
        Value: 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,
               se_index_extensions=on,condition_fanout_filter=on,
               derived_merge=on,use_invisible_indexes=off,skip_scan=on,
               hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,
               hypergraph_optimizer=off,derived_condition_pushdown=on
1 row in set (0.00 sec)

optimizer switches 尽管可以会话级设置,但大多数情况下,我们都当作一个全局参数在用。

特别是5.7升级8.0,8.0小版本升级的时候,optimizer switches的检查必须作为一个单独项。前面的文章中已经介绍了10多种优化器的策略、算法。更多细节参考(https://dev.mysql.com/doc/refman/8.0/en/switchable-optimizations.html

Optimizer Hints

https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html

Optimizer Hints的特性是5.7引入的,并在8.0做了扩展。可以通过hint 来影响查询计划的执行。

Hint 比optimizer switches的选项控制更精细,可以做到query block,table,index 三级。并且支持在查询期间更改配置选项的值,比会话级修改参数更细。比如可以限制一个sql的执行时间:

SELECT /*+ MAX_EXECUTION_TIME(2000) */
 id, Name, District
 FROM world.city
 WHERE CountryCode = 'AUS';
 ##查询被限制在2s之内。

Table 8.2 Optimizer Hints Available

图片

  • Global: The hint applies to the whole query.
  • Query Block: The hint applies to a group of joins. For example, the top level of the query is a query block; a subquery is another query block. Hints that apply to a query block can in some cases also take the table names for a join to limit the hint to a specific join.
  • Table: The hint applies to a specific table.
  • Index: The hint applies to the use of a specific index.

hint的语法 /*+ ... */ 注意三个点的前后都有一个空格。语法树都比较好看,举例几个比较难懂的语法。

#QB_NAME() 的用法。
可以把一个复杂的查询,划分成多个 query_block,然后再针对每个 qb进行hint的调优

#定义一个qb
SELECT /*+ QB_NAME(payment) */
 rental_id
 FROM sakila.payment
 WHERE staff_id = 1 AND customer_id = 75;

#复杂查询中,对一个qb进行hint
 SELECT /*+ NO_INDEX_MERGE(@payment payment) */
       rental_id, 
       rental_date,
       return_date
  FROM sakila.rental
 WHERE rental_id IN (
                     SELECT /*+ QB_NAME(payment) */
                            rental_id
                       FROM sakila.payment
                      WHERE staff_id = 1 AND customer_id = 75);

SELECT /*+ NO_INDEX_MERGE(payment@payment) */
       rental_id, 
       rental_date,
       return_date
  FROM sakila.rental
 WHERE rental_id IN (
                     SELECT /*+ QB_NAME(payment) */
                            rental_id
                       FROM sakila.payment
                      WHERE staff_id = 1 AND customer_id = 75);
#查询期间更改配置选项的值
SELECT /*+ SET_VAR(join_buffer_size = 1048576)
           SET_VAR(optimizer_search_depth = 0) */
       CountryCode, 
       country.Name AS Country,
       city.Name AS City, 
       city.District
  FROM world.country IGNORE INDEX (Primary)
 INNER JOIN world.city IGNORE INDEX (CountryCode)
         ON city.CountryCode = country.Code
      WHERE Continent = 'Asia';

 #SET_VAR一次只能修改一个vairable,多个vairable 需要多个SET_VAR
 #SET_VAR 不支持表达式,=号右边必须是具体的值

ps:怎么练习 sql 级别的hint的使用?

  1. 多读几遍25种hint的描述。
  2. 拿着一个正常的执行计划做参考,把一个异常的执行计划试着用hint改到期望的计划。
  3. 大多数的hint都是成对出现的,有关,有开两种组合。把一个正常的计划,试着用hint把计划改得糟糕。
  4. 从简单的sql,单表的入手。逐渐过渡到多表,单机,分布式数据库
  5. google MySQL hints 的经验 并实践。

Index Hints

这个大家应该很熟悉,ignore、use、force index

SELECT ci.CountryCode, 
       co.Name AS Country,
       ci.Name AS City, 
       ci.District
  FROM world.country co IGNORE INDEX (Primary)
 INNER JOIN world.city ci IGNORE INDEX (CountryCode)
    ON ci.CountryCode = co.Code
 WHERE co.Continent = 'Asia';

 SELECT *
   FROM world.city USE INDEX FOR ORDER BY (Primary)
  WHERE CountryCode = 'AUS'
  ORDER BY ID;

资源组(Resource Groups)

https://dev.mysql.com/doc/refman/8.0/en/resource-groups.html#resource-group-restrictions

对于high-concurrency systems的场景,MySQL8.0 在server 层,提供了一个resource groups 特性。

select  *  from  information_schema.RESOURCE_GROUPS \G
*************************** 1. row ***************************
   RESOURCE_GROUP_NAME: USR_default
   RESOURCE_GROUP_TYPE: USER
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 0x302D35
       THREAD_PRIORITY: 0
*************************** 2. row ***************************
   RESOURCE_GROUP_NAME: SYS_default
   RESOURCE_GROUP_TYPE: SYSTEM
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 0x302D35
       THREAD_PRIORITY: 0
2 rows in set (0.00 sec)

CREATE RESOURCE GROUP my_group  
TYPE = USER  
VCPU = 2-3,6,7 
THREAD_PRIORITY = 0 
ENABLE;

##RESOURCE_GROUP 是影响线程级别的,需要安装商业版本的thread_pool 
##(http://www.tdpub.cn/Blog/detail/id/1007.html)  thread_pool相关介绍 

##(https://zhuanlan.zhihu.com/p/114149600)  
##MySQL源码级线程init过程的分析 高并发创建MySQL线程时,遇到瓶颈,可能用得到。注意MySQL可以允许2000个并发同时运行与MySQL 1秒内创建200个并发 是不一样的概念。前者类似于高速上的车,后者类似于高速的入口。
##另外创建会话(连接)时的init 与show  processlist 看到State='init' 不一样。
##后面我的同事会投一篇<从processlist.state分析SQL执行阶段>的文章出来介绍。

##(https://zhuanlan.zhihu.com/p/114343815)   MySQL源码级连接与线程管理

 SELECT THREAD_ID, RESOURCE_GROUP  FROM performance_schema.threads  limit 5;
+-----------+----------------+
| THREAD_ID | RESOURCE_GROUP |
+-----------+----------------+
|         1 | SYS_default    |
|         3 | SYS_default    |
|         4 | SYS_default    |
|         5 | SYS_default    |
|         6 | SYS_default    |
+-----------+----------------+

资源组可用于指定线程允许使用哪些CPU,以及线程应使用哪个优先级执行。
这对于确定某些线程的优先级非常有用
执行优先级高于其他线程或防止资源争用。

本系列文章一共4篇,概括地介绍了优化器是怎么工作的,join的优化算法,以及优化 join的方法;以及怎么配置optimizer。

MySQL使用基于成本的优化器,其中估计查询执行的每个部分的成本,并选择总体查询计划以最小化成本。作为优化的一部分,优化器将使用各种转换重写查询,找到最佳连接顺序,并做出其他决定,例如应使用哪些索引。

MySQL 已经有三种基本的join 算法: NL,BNL,HASH JOIN 。HASH JOIN 弥补了NL 在缺少索引,或者索引选择性不佳时,触发的性能问题。同时HASH JOIN 也带来自身的一些性能问题。

重点聚焦了三种join 优化,index_merge 可以使用多个索引来提高效率。MRR 是通过减少随机IO 来提高效率。BKA=BNL+MRR

另外还介绍了多种影响优化器的方法。

一些有意思的链接:

(http://www.unofficialmysqlguide.com/index.html)(https://www.percona.com/blog/count-vs-countcol-in-mysql/)

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流:

image-20221030163217640

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531362.html

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

相关文章

Midjourney|文心一格prompt教程[基础篇]:注册使用教程、风格设置、参数介绍、隐私模式等

Midjourney|文心一格prompt教程[基础篇]&#xff1a;注册使用教程、风格设置、参数介绍、隐私模式等 开头讲一下为什么选择Midjourney和文心一格&#xff0c;首先Midjourney功能效果好不多阐述&#xff1b;其次文心一格再多次迭代优化后效果也不错&#xff0c;重点也免费&…

【Kubernetes】| K8s基础组件分析

目录 一. &#x1f981; 前言二. &#x1f981; K8s vs Docker三. &#x1f981; K8s基础组件3.1 Master组件3.1.1 api server3.1.2 controller manager3.1.3 scheduler3.1.4 etcd 3.2 Node组件3.2.1 kublet3.2.2 kube-proxy 四. &#x1f981; 最后 一. &#x1f981; 前言 Ku…

antd-vue-admin——通过链接跳过登录页直接进入系统内部——基础积累

最近在写后台管理系统&#xff0c;遇到一个需求&#xff0c;就是从系统A带参数可以直接进入到系统B内部。不通过系统B的登录页面进行登录。 一般系统的登录&#xff0c;都需要用户名和密码等参数&#xff0c;然后获取到token信息&#xff0c;最后进入到系统内部。 下面介绍具…

5-16SQL每日一题

如下两张表&#xff0c;G0516A和G0516B 要求G0516B按顺序与G0516A的第一个WEEK1依次有序的组合&#xff0c;直到依次组合完毕&#xff0c;预计结果如下&#xff1a; 测试数据&#xff1a; CREATE TABLE G0516A ( WEEKS VARCHAR(10) ) INSERT INTO G0516A VALUES (‘WEEK1…

Socket请求和Http请求区别和场景

我们在开发过程中遇到http请求和socket请求。大部分前后交互都是通过http请求的方式&#xff0c;那socket请求怎么使用&#xff0c;什么情况下使用呢&#xff1f; 基本概念 http请求&#xff1a;基于http协议的soap协议&#xff0c;常见的http数据请求方式有get和post&#xf…

OpenCV实现图像的缩放几何变换,图像金字塔,高斯不同

1.前言 实现图像的放大&#xff08;zoom in&#xff09;和缩小&#xff08;zoom out&#xff09;主要通过两种途径&#xff1a; 几何变换。图像金字塔。 2.几何变换 通过几何变换实现图像放大和缩小功能主要是通过OpenCV的resize函数&#xff1a; 1 2 3 4 5 6 7 8void resi…

二.深度学习yolov5 比特家异构计算 训练与转模型01

(备份笔记 仅记录) 走国产化路上 要离开老黄的NVIDIA了&#xff0c;现在摸索下比特家的异构计算 yolo还停在v3的阶段 因为之前v3就已经够产品化去用了。这次也走下yolov5吧&#xff01; 1.yolov5环境搭建 2.yolov5模型训练 3.yolov5模型测试 4.模型做truck 5.模型转换为…

【六袆 - Design Pattern】Strategy Pattern;策略模式;

JDK8源码使用的策略模式列举 java.util.comparator接口用于对对象进行排序。Comparator接口的compare()方法将两个对象作为参数&#xff0c;并返回一个整数值&#xff0c;表示这两个对象的相对顺序。比较器接口有许多不同的实现&#xff0c;每个实现都有不同的排序算法。例如&a…

OpenPCDet系列 | 5.4 PointPillars算法——AnchorHeadSingle模型预测头模块

文章目录 AnchorHeadTemplate模块1. AnchorGenerator2. ResidualCoder3. AxisAlignedTargetAssigner AnchorHeadSingle模块1. AnchorHeadSingle初始化2. AnchorHeadSingle训练前向传播3. AnchorHeadSingle测试前向传播 OpenPCDet的整个结构图&#xff1a; PointPillars算法属…

人人可用的开源数据可视化分析工具

大家好&#xff0c;我是互联网架构师&#xff01; 在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具&#xff0c;我们能够大幅提升数据分析效率、生成更高质量的项目报告&#xff0c;让用…

UE4/5中DataTable数据表的使用

我们在UE中经常要对配置数据进行编辑&#xff0c;用好UE自己的DataTable自然对日常使用有所帮助。 1.蓝图使用流程 1.1 DataTable创建 使用数据表首先得创建自定义结构体&#xff0c;这样才好定义每一行的格式&#xff0c;例如这里创建如下&#xff1a; 然后右键选择创建Da…

LiveGBS流媒体平台GB/T28181功能-NVR硬件下级平台级联上来的通道如何过滤过滤通道类型

LiveGBS流媒体平台GB/T28181功能-NVR硬件下级平台级联上来的通道如何过滤过滤通道类型 1、上来的通道多了怎么办?2、过滤通道类型2.1、设备单独过滤2.2、全局过滤通道类型 3、过滤指定通道国标编号4、搭建GB28181视频直播平台 1、上来的通道多了怎么办? 下级平台或是NVR设备…

个人黄金投资好做吗?黄金投资交易优势体现在哪些方面

黄金的高保值性深受市场喜爱&#xff0c;它兼具商品和货币的双重属性。不仅实物黄金备受青睐&#xff0c;就连黄金投资交易也受到市场喜爱。黄金投资交易优势主要有哪些要点呢&#xff1f; 黄金投资交易优势一、稀有性 黄金的价值是固有的、内在的&#xff0c;具有千年不朽的稳…

跟庄买股票得新技巧(2023.05.16)(第二弹)

北向资金&#xff08;也叫聪明的钱&#xff09;&#xff0c;它如何潜伏的&#xff08;上周&#xff09; 设么&#xff0c;你投诉大叔不写代码&#xff1f;好吧给你北向资金的代码 { 选股条件&#xff1a; 北向资金流入是昨天的两倍以上 } 百分比:REF(GPJYVALUE(6,1,1),1)>…

HttpClient5如何设置代理

文章目录 说明原始HttpClient代理HttpClient总结 说明 在这篇文章中会对HttpClient5如何进行代理进行说明&#xff0c;我的HttpClient版本是5.2.1。在进行代理之前请先准备好代理服务器。 原始HttpClient 下面是没有进行代理设置的代码&#xff0c;尝试去访问openai接口 Tes…

监控室值班人员脱岗睡岗识别算法 yolov7

监控室值班人员脱岗睡岗识别算法基于Yolov7深度学习神经网络算法&#xff0c;监控室值班人员脱岗睡岗识别算法模型可以7*24小时不间断自动人员是否在工位上&#xff08;脱岗睡岗玩手机&#xff09;&#xff0c;若人员没有在工位&#xff0c;系统则立即抓拍告警&#xff0c;算法…

GBASE南大通用携手长亮科技 重磅推出金融数据仓库联合解决方案

随着数字化转型进程深入&#xff0c;金融企业对数据赋能的需求更加迫切&#xff0c;如何融合内外部业务数据&#xff0c;实现数据纵向贯通、横向穿透&#xff0c;让数据资源真正成为业务发展的新引擎&#xff1b;同时&#xff0c;信创浪潮风起云涌&#xff0c;数据库作为底层软…

深度学习语义分割篇——FCN源码解析篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;深度学习语义分割篇——FCN原理详解篇 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&…

分享Python采集66个菜单导航,总有一款适合您

分享Python采集66个菜单导航&#xff0c;总有一款适合您 Python采集的66个菜单导航下载链接&#xff1a;https://pan.baidu.com/s/11ElCiEa6OesmPxY6U9320w?pwdvdok 提取码&#xff1a;vdok jQuery手风琴滑动下拉菜单展开收缩代码 JS树形结构下拉列表菜单选择代码 简单的…

人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)

目录 1. 前言 2. 项目安装 3. 人脸识别系统 &#xff08;1&#xff09;人脸检测和关键点检测 &#xff08;2&#xff09;人脸校准 &#xff08;3&#xff09;人脸特征提取 &#xff08;4&#xff09;人脸比对(1:1) &#xff08;5&#xff09;人脸搜索(1:N) &#xff08…