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打开你想恢复的文件转到文件 > 还原到 > 浏览所有版本...选择你想恢复的版本即…

su命令使用

1 变更到其他用户 su username su命令代表“switch user”(切换用户),并不是大多数人想象的“super user”(超级用户),能够让某个用户暂时以另一个用户的身份进行操作。当在shell中想快速成为root用户时,…

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

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

3dmax怎么制作软装模型?

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

PS基本操作

文件->打开:可以打开我们要测量的图片 CtrR:可以打开标尺,或者视图->标尺 右击标尺,把里面的单位改为像素 Ctr加号()可以放大视图,Ctr减号(-)可以缩小视图 按住…

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

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

聊聊CISP证书

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

boost::apply_visitor

boost::apply_visitor 是 Boost 库中用于访问 Variant 类型对象中存储的值的工具函数。Variant 类型是一种能够容纳多种类型值的类型,类似于联合体(union)或是 C17 中的 std::variant。 在 Boost 中,Variant 类型提供了一种安全、…

计算机网络-进阶

目录 易混淆物理层数据链路层网络层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模块在海洋领域的广泛应用,以及它…

Kubernetes 的用法和解析 -- 3

一.Secret 实现 1.1 secret 详解 secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。 …

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…

AI+爬虫 爬虫宝

场景 在很多时候,有很多爬虫的需求,其实需求都是大同小异,不过是在某某网页上爬取某某东西。把这些东西给到业务。以往的做法是:每一个需求写一个c#或者python脚本或者应用,进行爬取,这相当的费时费力&…

Java中创建线程池工具类

import java.util.concurrent.*;/**多线程工具类 */ public class ThreadPoolUtils {private static int CAPACITY 10000;// 线程池核心线程数public static int CORE_POOL_SIZE 10;// 线程池最大线程数private static int MAXIMUM_POOL_SIZE 30;// 额外线程空状态生存时间p…

前端视角看待IT圈茶余饭后的鄙视链

在IT职业圈或技术圈中,鄙视链是一个普遍存在的现象。鄙视链是指不同职业、技术、公司等之间存在的相互鄙视、轻视的关系。虽然这种关系并不合理,但它确实存在,而且在一定程度上影响着人们的心态和行为。 作为一名前端开发者,我深…