Mysql 学习(十)基于成本的优化 一

news2024/11/16 13:55:56

什么是成本

  • 执行一个查询可以有不同的执行方案,优化器会选择一个成本比较低的方案去执行,但是现在有个疑问,MySQL的查询执行成本是哪些呢?
  • 主要有两方面组成:
    • I/O成本:myisam和innodb存储引擎将数据和索引存储到磁盘上,所以当我们想查询数据的时候就需要要把数据从磁盘加载到内存中操作,而这一个过程损耗的时间就是I/O成本
    • CPU成本:读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。
  • 对于Innodb存储引擎来说,页是磁盘和内存之间的交互单位,所以我们计算成本,通常是以页为单位的,并且规定读取一个页花费的成本默认是1.0,读取和检测一条记录是否符合搜索条件的成本默认是0.2

窥探单表查询的成本

  • 为了更好理解,我们肯定需要一张表
CREATE TABLE index_value_table (
    id INT NOT NULL AUTO_INCREMENT,
    value1 VARCHAR(100),
    value2 INT,
    value3 VARCHAR(100),
    value_part1 VARCHAR(100),
    value_part2 VARCHAR(100),
    value_part3 VARCHAR(100),
    common_field VARCHAR(100),
    PRIMARY KEY (id),
    KEY idx_key1 (value1),
    UNIQUE KEY idx_key2 (value2),
    KEY idx_key3 (value3),
    KEY idx_key_part(value_part1, value_part2, value_part3)
) Engine=InnoDB CHARSET=utf8;

优化步骤

  • 在一条语句真正执行之前,我们的mysql优化器都会先把该语句的所有执行方案找出来,然后判断出成本最低的方案,然后再继续执行,详细的过程如下:
    • 根据搜索条件找出所有可能使用的索引
    • 计算全表的代价
    • 计算使用不同索引的代价
    • 找出代价最小的方案
  • 下面我们通过一条语句来讲解这些过程:
    SELECT * FROM index_value_table WHERE value1 IN ('a', 'b', 'c') AND value2 > 10 AND value2 < 1000 AND value3 > value2 AND value_part1 LIKE '%hello%' AND common_field = '123';
    • 注意计算成本的时候,设计师都会在代码上加入一些微调的数值,这些数值的意义不知道

根据搜索条件找出所有可能的索引

  • 先来看查询条件:
    • value1 IN (‘a’, ‘b’, ‘c’),这个搜索条件可以使用二级索引idx_key1。
    • value2 > 10 AND value2 < 1000,这个搜索条件可以使用二级索引idx_key2。
    • value3 > value2,这个搜索条件的索引列由于没有和常数比较,所以并不能使用到索引。
    • value_part1 LIKE ‘%hello%’,value_part1通过LIKE操作符和以通配符开头的字符串做比较,不可以适用索引。
    • common_field = ‘123’,由于该列上压根儿没有索引,所以不会用到索引。
  • 所以可能用到的索引:idx_key1 和 idx_key2

计算全表的代价

  • 对于Innodb而言,全表扫描的意义就是把聚簇索引的记录都依次和搜索条件做一下比较,把符合搜索条件的记录加入到结果集,所以需要将聚簇索引对应的页面加载到内存中,然后再检测记录是否符合搜索条件。由于查询成本=I/O成本+CPU成本,所以计算全表扫描的代价需要两个信息:
    • 聚簇索引占用的页面数
    • 该表中的记录数
  • 而这两个信息从哪来呢?
  • 答案是底层每个表维护了一系列的统计信息,优化器可以通过这些信息知道,而我i们用户怎么看呢?
  • 通过sql SHOW TABLE STATUS LIKE 'index_value_table' 获取
    在这里插入图片描述
  • 其中有两个字段我们是需要的:
    • Rows:表示本表有多少记录
      • 对于使用MyISAM存储引擎的表来说,该值是准确的
      • 对于使用InnoDB存储引擎的表来说,该值是一个估计值
    • Data_length:表示本表占用多少存储空间字节数
      • Data_length = 聚簇索引的页面数量 x 每个页面的大小
  • 拿到这两个值以后我们就可以计算了,假设我们这两个值分别是 Rows = 9693 和 Data_length = 1589248
  • 计算一下 I/0 成本:
    • 聚簇索引的页数: 1589248 / 16 / 1024 = 97
    • 成本 : 97 x 1.0 + 1.1(微调数值 = 98.1
  • 计算一下CPU 成本:
    • 成本:9693 x 0.2 + 1.0 = 1939.6
  • 总的成本:1939.6 + 98.1 = 2037.7
  • 所以得出全表扫描的成本是 2037.7

计算使用不同索引的代价

计算 idx_key1 的代价

  • idx_key1 对应的搜索条件是 value1 in ('a','b','c'),明显是是3个单点区间,所以需要访问3次,找出对应范围的二级索引记录,大概是118条,然后进行回表
  • I/O 成本:
    • 搜索二级索引 I/0成本:3 x 1.0 = .3.0
      • 不论某个范围区间的二级索引到底占用了多少页面,查询优化器粗暴的认为读取索引的一个范围区间的I/O成本和读取一个页面是相同的。
    • 回表成本:118 x 1.0 = 118.0
    • 总成本:3.0 + 118.0 = 121.0
  • CPU 成本
    • 搜索二级索引成本:118 x 0.2 + 0.01 = 23.61
    • 回表成本:118 x 0.2 = 23.6
    • 总成本:23.61 + 23.6 = 47.21
  • 总成本:47.21 + 121.0 = 168.21

计算 idx_key2 的代价

  • idx_key2 是唯一二级索引,所以通过搜索条件 value2 > 10 AND value2 < 1000,找出对应范围的二级索引记录,大概是95条,然后进行回表
  • I/O 成本:
    • 搜索二级索引 I/0成本:1 x 1.0 = .1.0
      • 不论某个范围区间的二级索引到底占用了多少页面,查询优化器粗暴的认为读取索引的一个范围区间的I/O成本和读取一个页面是相同的。
    • 回表成本:95 x 1.0 = 95.0
    • 总成本:1.0 + 95.0 = 96.0
  • CPU 成本
    • 搜索二级索引成本:95 x 0.2 + 0.01 = 19.01
    • 回表成本:95 x 0.2 = 19.0
    • 总成本:19.01 + 19 = 38.01
  • 总成本:38.01 + 96.0 = 134.01

找出代价最小的方案

  • 通过上面的计算代价,找出成本最低的那个:
    • 全表扫描的成本:2037.7
    • 使用idx_key2的成本:134.01
    • 使用idx_key1的成本:168.21
  • 由于 idx_key2 成本最低,所以我们就会选择 idx_key2 来执行查询方案

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

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

相关文章

盘点慢查询原因及优化方法

目录 一&#xff0c;前言二&#xff0c;准备type重点看 三&#xff0c;慢查询原因和解决1&#xff0c;sql未加索引2&#xff0c;索引失效3&#xff0c;limit深分页问题&#xff08;1&#xff09;limit深分页为什么会慢&#xff08;2&#xff09;深分页优化 4&#xff0c;in元素…

网安笔记 09 PKI PMI

PKI PMI PKI 公钥基础设施 public key infrastructure 遵循标准的&#xff0c;利用公钥理论和技术建立的提供安全服务的基础设施 **目的&#xff1a;**身份认证&#xff0c;点滴信息不完整&#xff0c;不可抵赖&#xff0c;提供可靠安全服务 **任务&#xff1a;**可信任数字…

【发表案例】智能传感类、持续学习模型、计算建模、边缘计算等领域SCI,最快仅1个月14天录用

3区智能传感类SCI&EI 【期刊简介】IF:1.5-2.0&#xff0c;JCR3区&#xff0c;中科院4区 【检索情况】SCI&EI 双检&#xff0c;正刊 【征稿领域】智能信号处理技术在基于机器学习中遥感相关的应用研究 录用案例&#xff1a;2个月零5天录用 2023.04.28 | Accept 20…

OpenPCDet系列 | 7.PointPillars模型测试KITTI数据集流程解析

文章目录 模型的测试流程1. AnchorHeadTemplate.generate_predicted_boxes部分2. Detector3DTemplate.post_processing部分3. KittiDataset.generate_prediction_dicts部分4. KittiDataset.evaluation部分模型的测试流程 对于模型来说,训练过程是为了计算构建损失训练模型的参…

小程序安全架构分析

小程序大家已经再熟悉不过了&#xff0c;就是一种在移动操作系统中运行的轻量级应用程序&#xff0c;小程序发展这么多年来&#xff0c;是中国 IT 行业里为数不多的能够真正影响到普通程序员的创新成果。 当然随着小程序的流行&#xff0c;小程序的各个方面都是开发者讨论的热…

20230503 - 二叉树2 | 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

1、二叉树的层序遍历 二叉树的层序遍历&#xff0c;就是图论中的广度优先搜索在二叉树中的应用&#xff0c;需要借助队列来实现&#xff08;此时又发现队列的一个应用了&#xff09;。 来吧&#xff0c;一口气打十个&#xff1a; 102.二叉树的层序遍历 class Solution {pub…

一心报国的西工大网安人走出新手村

大二下学期5月5日晚上&#xff0c;西工大长安校区教学西楼&#xff0c;作为一名网安专业本科生&#xff0c;从大一便立志学好网安知识&#xff0c;报效祖国&#xff0c;却苦于没有优秀学习资源&#xff0c;就把这事儿拖到了大二&#xff0c;最近上了一门专业课&#xff0c;如同…

Wireshark抓包:详解TCP四次挥手报文内容

一、详解tcp四次挥手 刚才用图解释了tcp四次挥手的过程。用wireshark抓一个包&#xff0c;进行详细的分析。 1.客户端发的第一个释放连接的请求 这是抓的包&#xff0c;然后过滤出来的&#xff0c;看下最后的阶段&#xff0c;是要开始释放一个链接了。这里是第一个fin&#…

PSP - 适配不同来源的 AlphaFold2 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

如何快速构建 Zabbix 原生高可用?

Zabbix Meetup成都站议程 14:30 《如何快速构建 Zabbix 原生高可用》 周松&#xff0c;Zabbix 大中华区培训师&#xff0c;架构师 15:00 《基于 Zabbix 开发的拨测平台–OneMonitor》 唐荣&#xff0c;社区用户 15:30 《Zabbix 与信创生态的融合》 侯健&#xff0c;上海宏…

VS安装项目生成错误提示:SQL Server 2008 R2 SP2 Management Studio

错误提示内容&#xff1a; 原因是在Visual Studio XXXX中创建设置时遇到错误。 提示错误信息&#xff1a; 0:Watson 1:1304 2:StreamSupportFiles 3:streamBinaryToDisk 4:5 5.e:lsql10 main tlsgllsetupidarwinsglcastublstreamca.cpp 6:238 7:sglcastub.dll 8:sglrun.msi 点…

Python每日一练(20230510) 石子游戏 VII\VIII\IX

目录 1. 石子游戏 Stone Game VII 2. 石子游戏 Stone Game VIII 3. 石子游戏 Stone Game IX &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 石子游戏 Stone Game VII 石子游戏中&…

Android音视频开发之音频录制和播放

1.封装音频录制工具类&#xff1a; public class RecorderAudioManagerUtils {private static volatile RecorderAudioManagerUtils mInstance;public static RecorderAudioManagerUtils getInstance() {if (mInstance null) {synchronized (RecorderAudioManagerUtils.class…

【连续介质力学】简介

什么是连续介质力学 连续介质力学的假设 连续介质力学的流体性质&#xff1a;质量密度&#xff0c;压强和速度假设为连续函数 将原子系统看作是连续 分子的平均自由程&#xff1a; Λ \Lambda Λ 物理特征长度&#xff1a; l c l_c lc​ 克劳森数&#xff08;Knudsen number…

数字城市发展,哪些技术可以深度应用

说到数字城市、智慧城市大家都会觉得经常在耳边听到&#xff0c;但是要确切的说出具体的概念还是有一些难度的。具体来讲&#xff1a;数字城市是一个集合多种技术的系统&#xff0c;以计算机技术、多媒体技术和大规模存储技术为基础&#xff0c;以宽带网络为纽带&#xff0c;运…

Grafana 系列-统一展示-5-AWS Cloudwatch 仪表板

系列文章 Grafana 系列文章 &#x1f44d;️强烈推荐 强烈推荐使用 GitHub 上的 monitoringartist/grafana-aws-cloudwatch-dashboards 仪表板。该 repo 有一系列 AWS 资源的仪表板&#xff0c;包括但不限于&#xff1a; EC2EBSAPI GWAutoscalingBillingEKSLambdaLogsRDSS3…

Unity3D :树

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 树 可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而&#xff0c;树是从表面生长的 3D 对象实体。Unity 使用优化&#xff08;比如针对远处树的公告牌&#xff09;来保持…

关于 std::condition_variable

一. std::condition_variable是什么&#xff1f; std::condition_variable 是 C 标准库提供的一个线程同步的工具&#xff0c;用于实现线程间的条件变量等待和通知机制。 条件变量的发生通常与某个共享变量的状态改变相关。 在多线程编程中&#xff0c;条件变量通常和互斥锁…

Mac执行ruby命令提示 dyld: Library not loaded等类似问题解决方案

说一下为啥会遇见这么个问题&#xff0c;我在给一个xcode项目添加podfile的时候&#xff0c;在终端执行了pod init命令&#xff0c;随即给了我一个如下图的提示&#xff08;报错信息一样的&#xff0c;执行pod的命令早就被解决问题过程中频繁的下载过程刷上去了。。。&#xff…

对于档案室内部设备硬件及温湿度的要求

编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 档案室温湿度及硬件要求 一、各档案库的建筑及技术参数&#xff1a; 1.各馆室的最小面积应能容纳目前各资料存放&#xff0c;还必须考虑一定的发展空间。 2.地板承重最大容量为1240公斤/平米&#xff0c;采用…