SQL进阶理论篇(十四):CBO优化器是如何计算代价的?

文章目录

  • 简介
  • 能调整的代价模型的参数有哪些?
    • mysql.server_cost
    • mysql.engine_cost
  • 如何修改这些代价参数?
  • 代价模型具体是如何计算的
  • 参考文献

简介

大部分RDBMS都支持基于代价的优化器CBO,但其实CBO仍然存在缺陷(比如参数配置的不合理等),接下来我们会通过CBO的工作原理,来辅助了解优化器的执行过程。

能调整的代价模型的参数有哪些?

MySQL中的COST Model,就是优化器用来统计各种步骤的代价模型。

在5.7.10版本之后,MySQL引入了两张系统数据表,里面规定了各种步骤的预估代价,我们可以通过查看这两张表,来查看这些步骤的代价:

  • mysql.server_cost,统计在server层的代价;
  • mysql.engine_cost,统计在物理引擎层的代价。

mysql.server_cost

SQL > SELECT * FROM mysql.server_cost

在这里插入图片描述

部分低版本MySQL打印不出default_value这一列,比如说我的5.7.37版本就只有前4列,但是我的8.0版本可以打印出全部的5列。

可以看到,一共有6行。

这6行具体的含义如下:

  • disk_temptable_create_cost,表示临时表文件(MyISAM或者InnoDB)的创建代价,默认是20;
  • disk_temptable_row_cost,表示临时表文件的行代价,默认是0.5;
  • key_compare_cost,表示键比较的代价。键比较的次数越多,这项的代价就越大,默认是0.5。重要指标
  • memory_temptable_create_cost,在内存中创建临时表的代价,默认值是1;
  • memory_temptable_row_cost,内存中临时表的行代价,默认值是0.1;
  • row_evaluate_cost,统计符合条件的行代价。如果符合情况的行越多,那么这一项的代价就越大。默认值是0.1。重要指标

从上面来看,在磁盘上(非内存)创建一个临时表的代价还是很高的。

mysql.engine_cost

SQL > SELECT * FROM mysql.engine_cost

在这里插入图片描述

engine_cost这张表,主要统计了页加载的代价。

一共有两项:

  • io_block_read_cost,从磁盘上读取一页数据的代价,默认是1;
  • memory_block_read_cost,从内存中读取一页数据的代价,默认是0.25。

如何修改这些代价参数?

既然数据表已经提供给了我们,那我们就可以根据实际情况,来修改这些参数。

比如说,如果使用的是普通磁盘,那么可以考虑适当增加io_block_read_cost的数值。

那么如果我想把这个值设置成2.0,使用下面的命令就可以:

UPDATE mysql.engine_costSET cost_value = 2.0WHERE cost_name = 'io_block_read_cost';
FLUSH OPTIMIZER_COSTS;

之后再查看engine_cost表的时候,io_block_read_costcost_value就被改成了2.0。

但如果我只是想针对单个存储引擎,比如说我只让InnoDB的io_block_read_cost参数设置成2.0,那么可以使用下面的命令:

INSERT INTO mysql.engine_cost(engine_name, device_type, cost_name, cost_value, last_update, comment)VALUES ('InnoDB', 0, 'io_block_read_cost', 2,CURRENT_TIMESTAMP, 'Using a slower disk for InnoDB');
FLUSH OPTIMIZER_COSTS;

之后再查看engine_cost表的时候,会发现多了一行:

在这里插入图片描述

代价模型具体是如何计算的

这个过程比较复杂。

论文《Access Path Selection-in a Relational Database Management System》里给出了计算模型。如图:

在这里插入图片描述

可以简单的认为,总的执行代价等于IO代价 + CPU代价。

PAGE FETCH就是IO代价,也就是页加载的代价,包括数据页的加载和索引页的加载。

W*(RSI CALLS),就是CPU代价。

W在这里是个权重因子,表示了CPU到IO之间转化的相关系数。

RSI CALLS表示CPU的代价估算,包括了键比较以及行估算的代价。

需要说明的是,MySQL5.7版本之后,上面的代价模型又被完善了,进一步考虑了内存计算和远程操作的代价,即演变成了:

总代价 = IO代价 + CPU代价 + 内存代价 + 远程代价

这个了解下就可以了,后两个代价没有前两个代价那么重要。

参考文献

  1. 32丨查询优化器是如何工作的?

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

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

相关文章

Xcode 恢复Discard Changes

当开发的时候,Discard All Changes后 文件的修改都被放弃了,怎么才可以撤销更改呢 Xcode和Git没有这个功能,Finder可以实现 首先我们先退出Xcode用TextEdit打开你想恢复的文件转到文件 > 还原到 > 浏览所有版本...选择你想恢复的版本即…

【Python-批量修改视频分辨率】

Python-批量修改视频分辨率 1 使用Python修改视频分辨率2 常见的视频编码格式2.1 等效的编码格式表示方式2.2 常见的编码格式 1 使用Python修改视频分辨率 首先拷贝视频文件并修改后缀,然后修改图片的分辨率,实现视频批量修改和转换。 import os impor…

3dmax怎么制作软装模型?

软装在室内设计中经常用到,很多人感觉很难,其实也有很多简单的方法,这里介绍一种软装的制作方法。 1、打开3dmax,创建一个切角长方体,对长方体的长和宽进行适当的分段。 2、将切角长方体转换成可编辑多边形。推荐&…

实战篇:一文讲清楚电商平台用户评价分析

01 明确问题 随着电商平台的成熟,如何提升用户体验、提高客户留存率也成为了电商平台关注的重点。而用户评价是最直观地能反应用户体验的指标。用户差评更是其中的重点,通过差评分析,可以寻找到平台目前存在的可能导致用户打出差评的因素&am…

聊聊CISP证书

文章目录 什么是CISP为什么要考这个证报考条件是什么没达到工作年限可不可以考必须要报班吗如何找培训机构培训机构能提供什么考试一般安排在什么时候学习多长时间可以考证多长时间出成绩&拿证必须要和自己工作关联吗考试注意事项怎么选择方向需要学的内容证书有效期多长时…

计算机网络-进阶

目录 易混淆物理层数据链路层网络层nat如何实现私有ip通信IP数据报 格式解析tcp 连接tcp流量控制滑动窗口拥塞控制 报文捕获 wireshark路由模拟器 enspcdn代理服务器 VS cdn VS web cache 计算机有了物理地址,为什么还要有ip地址?单播 多播 广播 传输层会…

基于AWD攻防对Web漏洞的研究

写在前面 Copyright © [2023] [Myon⁶]. All rights reserved. 基于awd攻防环境和xshell远程连接,配合kali linux渗透系统、蚁剑、D盾、河马、Seay代码审计系统等,演示现实中网站可能存在的漏洞,对网站进行漏洞扫描,渗透测…

【jvm从入门到实战】(九) 垃圾回收(2)-垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代,除了G1之外其他垃圾回收器必须成对组合进行使用 垃圾回收器的组合使用关系图如下。 常用的组合如下: Serial(新生代) Serial Old(老年代) Pa…

GNSS模块在海洋领域的应用

随着科技的不断进步,GNSS(全球导航卫星系统)模块在各个领域的应用逐渐成为日常生活的一部分。在海洋领域,GNSS技术为航海、渔业、海洋科学研究等提供了关键的支持。本文将深入探讨GNSS模块在海洋领域的广泛应用,以及它…

Redis介绍与使用

1、Nosql 1.1 数据存储的发展 1.1.1 只使用Mysql 以前的网站访问量不大,单个数据库是完全够用的。 但是随着互联网的发展,就出现了很多的问题: 数据量太大,服务器放不下 访问量太大,服务器也承受不了 1.1.2 缓存…

移动端自适应

1.普通html页面 一般使用px定义,不会进行适配 移动端项目:从不同的终端保持页面的一致性(自适应),使用rem相对单位,rem是相对于根节点html的font-size的值进行动态换算的值 2.普通html页面进行适配 普通页面中&…

wps三级标题不对齐

段落中设置首行缩进即可对其 效果: 使用格式刷去将其他三级标题同步

使用yarn安装electron时手动选择版本

访问1Password或者其他可以提供随机字符的网站,获取随机密码运行安装命令 操作要点,必须触发Couldnt find any versions for "electron" that matches "*"才算成功 将复制的随机密码粘贴到后面 例如:yarn add --dev elec…

Java基础知识回顾

Java基础 一、Java概述 1、Java技术体系平台 类型简介JavaSE 标准版支持面向桌面级的应用JavaEE 企业版支持为企业开发的应用JavaME 小型版运行在移动终端的平台 2、Java重要的特点 面向对象的语言(OOP) 健壮的语言,具有强类型转换、异常…

【Docker】基础篇

文章目录 Docker为什么出现容器和虚拟机关于虚拟机关于Docker二者区别: Docker的基本组成相关概念-镜像,容器,仓库安装Docker卸载docker阿里云镜像加速docker run的原理**为什么容器比虚拟机快**Docker的常用命令1.帮助命令2.镜像相关命令3.容…

SpringMVC拦截器

拦截器 1.拦截器概念2.拦截器开发2.1环境准备2.2拦截器开发流程 3 拦截器参数1. 前置处理方法2. 后置处理方法3 完成处理方法4.配置多个拦截器 1.拦截器概念 (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源…

可实现RSSD云硬盘120万IOPS的SPDK IO路径优化

一. 简介 用户对超高并发、超大规模计算等需求推动了存储硬件技术的不断发展,存储集群的性能越来越好,延时也越来越低,对整体IO路径的性能要求也越来越高。在云硬盘场景中,IO请求从生成到后端的存储集群再到返回之间的IO路径比较…

【Java】网络编程-UDP字典服务器客户端简单代码编写

上文讲了UDP回响服务器客户端简单代码编写 本文将讲述UDP字典服务器客户端简单代码编写。所谓回显,就是指客户端向服务器发送一个报文,从服务器那里得到一条一模一样的回响报文 而我们的字典功能呢,则是实现了输入中文,得到对应…

智能物联网汽车3d虚拟漫游展示增强消费者对品牌的认同感和归属感

汽车3D虚拟展示系统是一种基于web3D开发建模和VR虚拟现实技术制作的360度立体化三维汽车全景展示。它通过计算机1:1模拟真实的汽车外观、内饰和驾驶体验,让消费者在购车前就能够更加深入地了解车辆的性能、特点和设计风格。 华锐视点云展平台是一个专业的三维虚拟展…

Pytorch:backward()函数详解

.backward() .backward() 是 PyTorch 中用于自动求导的函数,它的主要作用是计算损失函数对模型参数的梯度,从而实现反向传播算法。 在深度学习中,我们通常使用梯度下降算法来更新模型参数,使得模型能够逐步逼近最优解。 在梯度下…