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.hqwc.cn/news/286736.html

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

相关文章

Android 原始方法实现Tablayout样式

源码: 【免费】Android原始方法实现Tablayout样式资源-CSDN文库 推荐: GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout …

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说,渲染速度慢是一个常见问题,尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师,他们通常使用3ds Max这样的工具,而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…

Spring事务浅析

一:Spring事务简介 什么是事务: 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么一起成功,要么一起失败,是一个不可分割的工作单元。 在我们日常工作中,涉及到事务的场景非常多,一个…

一、串行FLASH文件系统FatFs简介

本节主要给大家介绍以下内容: 文件系统简介 FatFs文件系统简介 FatFs文件系统移植 FatFs功能使用 一、文件系统简介 当我们在使用SPI FLASH直接存储数据 当需要记录字符“STM32 SPI FLASH”时。可以把这些文字转化成ASCII码,存储在数组中&#xff0…

查看CPU的型号方法很多,而且步骤简单

每台计算机至少包含一个处理器,也称为CPU或中央处理单元。你电脑的CPU可能是由英特尔或AMD制造的。以下是如何查看你的CPU以及它的速度。 在设置应用程序中查找你的CPU 要在Windows 10或Windows 11设置应用程序中查找此信息,请导航到“设置”>“系统…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用:一般用作要执行的处理(process),在程序流程图中做执行框。 在axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形…

spring MVC概述和土门案例(无配置文件开发)

SpringMVC 1,SpringMVC概述2,SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好,小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

C#拼接JSON

一、业务背景 最近项目需要与U8c对接,实现增删改查,借此机会,梳理一下C#解析Json字符串的问题。 这篇文章,先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json,无非就是{}和[]的来回嵌套。 首先&am…

JavaScript 内存管理的秘密武器:垃圾回收(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Java中Exception的使用方法

Exception介绍异常处理机制的优缺点常见的Exception异常处理的常见错误优雅的处理异常异常处理中存在的性能问题Java自定义异常示例 Exception介绍 在Java中,异常(Exception)是一种特殊类型的对象,表示程序运行过程中发生的意外或…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备:另起一台新服务器,并配置docker yum源,安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…