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

news2024/11/17 7:25:54

文章目录

  • 简介
  • 能调整的代价模型的参数有哪些?
    • 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_cost
  SET cost_value = 2.0
  WHERE 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.coloradmin.cn/o/1323072.html

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

相关文章

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好,我是二狗。 今天,有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试! 当网友询问ChatGPT API调用查询模型的确切名称是什么时? ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

解决腾讯云CentOS 6硬盘空间不足问题:从快照到数据迁移

引言: 随着数据的不断增加,服务器硬盘空间不足变成了许多运维人员必须面对的问题。此主机运行了httpd(apache服务),提供对外web访问服务,web资源挂载在**/data/wwwroot目录下,http日志存放在/data/wwwlogs目录下&…

【MATLAB源码-第101期】基于matlab的蝙蝠优化算BA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 蝙蝠算法(BA)是一种基于群体智能的优化算法,灵感来源于蝙蝠捕食时的回声定位行为。这种算法模拟蝙蝠使用回声定位来探测猎物、避开障碍物的能力。在蝙蝠算法中,每只虚拟蝙蝠代表…

【Hadoop精讲】HDFS详解

目录 理论知识点 角色功能 元数据持久化 安全模式 SecondaryNameNode(SNN) 副本放置策略 HDFS写流程 HDFS读流程 HA高可用 CPA原则 Paxos算法 HA解决方案 HDFS-Fedration解决方案(联邦机制) 理论知识点 角色功能 元数据持久化 另一台机器就…

SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

目录 一:Docker基本操作 1. 镜像操作 镜像相关命令 2. 容器操作 容器相关命令 3. 数据卷(容器数据管理) 数据卷 操作数据卷 挂载数据卷 挂载的方式区别 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂&#xff0…

MySQL面试经典50题

本文使用的MySQL版本为5.7.21,需要的数据表创建如下: 1.学生表student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10))…

jdk 线程池与 tomcat 线程池对比

一、线程池的作用 1. 提高性能:线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有空间,同时也会一比一的创建一个内核线程,在线程销毁时需要回收这些系统资源。频繁地创建和销毁线程会大大浪费系统资源,这时候就需要…

2023_Spark_实验三十:测试Flume到Kafka

实验目的:测试Flume采集数据发送到Kafka 实验方法:通过centos7集群测试,将flume采集的数据放到kafka中 实验步骤: 一、 kafka可视化工具介绍 Kafka Tool是一个用于管理和使用Apache Kafka集群的GUI应用程序。 Kafka Tool提供了…

《点云处理》 点云去噪

前言 通常从传感器(3D相机、雷达)中获取到的点云存在噪点(杂点、离群点、孤岛点等各种叫法)。噪点产生的原因有不同,可能是扫描到了不想要扫描的物体,可能是待测工件表面反光形成的,也可能是相…

原子学习笔记2——输入设备应用编程

一、输入类设备介绍 1、输入设备 常见的输入设备有鼠标、键盘、触摸屏、遥控器、电脑画图板等,用户通过输入设备与系统进行交互。 2、input子系统 常见的输入设备有鼠标、键盘、触摸屏、遥控器、电脑画图板等,用户通过输入设备与系统进行交互。 基于…

docker 在线安装redis

1、远程仓库拉取redis镜像, docker pull redis,默认拉取最新版本 2、在本地宿主机文件夹下创建相关目录文件,供容器卷使用,创建 /usr/local/data/redisdocker/data 文件夹,准备一个纯净版 redis.conf 配置文件 &#x…

【Linux】ip命令使用

ip命令 用于管理与配置网络接口和路由表。 ip命令的安装 ip 命令来自 iproute2 软件包,在 CentOS 7 中默认已安装。 yum install -y iproute 语法 ip [ OPTIONS ] OBJECT { COMMAND | help }ip [ -force ] -batch filename选项及作用 执行令 : ip …

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈,参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据(前端篇)-CSDN博客。 2.需求描述 在OA办公系统中,流程表单申请人…

【SQL】根据年月,查询月份中每一天的数据量

传入YYYY-MM-01&#xff0c;查询这个月中每一天的数据量&#xff0c;没有数据的天数用0表示 WITH RECURSIVE DateRange AS (SELECT :startDate AS DateUNION ALLSELECT DATE_ADD(Date, INTERVAL 1 DAY) FROM DateRangeWHERE Date < LAST_DAY(:startDate) ) SELECTdr.Date,CO…

从 MySQL 到 DolphinDB,Debezium + Kafka 数据同步实战

Debezium 是一个开源的分布式平台&#xff0c;用于实时捕获和发布数据库更改事件。它可以将关系型数据库&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的变更事件转化为可观察的流数据&#xff0c;以供其他应用程序实时消费和处理。本文中我们将采用 Debezium 与 K…

单总线cpu设计(包含定长指令周期和变长指令周期和现代时序设计)

来都来了点个赞收藏一下再走呗~~~&#x1f339;&#x1f339;&#x1f339;&#x1f339;&#x1f339; 一、定长指令周期cpu设计 第1关&#xff1a;MIPS指令译码器设计 此实验就是只需要知道mips知道操作码op对应的值是什么就可以了&#xff0c;下面给出实验中用到的mips指令…

大型语言模型:RoBERTa — 一种稳健优化的 BERT 方法

slavahead 一、介绍 BERT模型的出现BERT模型带来了NLP的重大进展。 BERT 的架构源自 Transformer&#xff0c;它在各种下游任务上取得了最先进的结果&#xff1a;语言建模、下一句预测、问答、NER标记等。 尽管 BERT 性能出色&#xff0c;研究人员仍在继续尝试其配置&#xff0…

JNDI注入Log4jFastJson白盒审计不回显处理

目录 0x00 前言 0x01 Maven 仓库及配置 0x02 JNDI 注入简介 0x03 Java-第三方组件-Log4J&JNDI 0x04 Java-第三方组件-FastJson&反射 0x05 白盒审计 - FastJson 0x06 白盒审计 - Log4j 0x07 不回显的处理方法 0x00 前言 希望和各位大佬一起学习&#xff0c;如果…

RK3399平台开发系列讲解(内核入门篇)网络协议的分层

🚀返回专栏总目录 文章目录 一、应用层二、传输层三、网络层四、数据链路层(Data Link Layer)五、物理层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对于多数的应用和用户而言,使用互联网的一个基本要求就是数据可以无损地到达。用户通过应用进行网络通信࿰

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…