MySQL 基于成本的优化

其实在MySQL中⼀条查询语句的执⾏成本是由下边这两个⽅⾯组成的:

I/O成本

我们的表经常使⽤的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中 然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。

CPU成本

读取以及检测记录是否满⾜对应的搜索条件、对结果集进⾏排序等这些操作损耗的时间称之为CPU成本。 对于InnoDB存储引擎来说,⻚是磁盘和内存之间交互的基本单位,设计MySQL的⼤叔规定读取⼀个⻚⾯花费的成本默认是1.0,读取以及检测⼀条记录是否符 合搜索条件的成本默认是0.2。1.0、0.2这些数字称之为成本常数,这两个成本常数我们最常⽤到,其余的成本常数我们后边再说哈。

基于成本的优化步骤 在⼀条单表查询语句真正执⾏之前,MySQL的查询优化器会找出执⾏该语句所有可能使⽤的⽅案,对⽐之后找出成本最低的⽅案,这个成本最低的⽅案就是所 谓的执⾏计划,之后才会调⽤存储引擎提供的接⼝真正的执⾏查询,这个过程总结⼀下就是这样:

1. 根据搜索条件,找出所有可能使⽤的索引

2. 计算全表扫描的代价

3. 计算使⽤不同索引执⾏查询的代价

4. 对⽐各种执⾏⽅案的代价,找出成本最低的那⼀个

下边我们就以⼀个实例来分析⼀下这些步骤,单表查询语句如下:

1. 根据搜索条件,找出所有可能使⽤的索引

我们前边说过,对于B+树索引来说,只要索引列和常数使⽤=、、IN、NOT IN、IS NULL、IS NOT NULL、>、=、)或者LIKE操作符连接起来,就可以产⽣⼀个所谓的范围区间(LIKE匹配字符串前缀也⾏),也就是说这些搜索条件都可能使⽤到索引,设计MySQL的⼤ 叔把⼀个查询中可能使⽤到的索引称之为possible keys。

我们分析⼀下上边查询中涉及到的⼏个搜索条件:

key1 IN ('a', 'b', 'c'),这个搜索条件可以使⽤⼆级索引idx_key1。

key2 > 10 AND key2 < 1000,这个搜索条件可以使⽤⼆级索引idx_key2。

key3 > key2,这个搜索条件的索引列由于没有和常数⽐较,所以并不能使⽤到索引。

key_part1 LIKE '%hello%',key_part1通过LIKE操作符和以通配符开头的字符串做⽐较,不可以适⽤索引。

common_field = '123',由于该列上压根⼉没有索引,所以不会⽤到索引。

综上所述,上边的查询语句可能⽤到的索引,也就是possible keys只有idx_key1和idx_key2。

2. 计算全表扫描的代价

对于InnoDB存储引擎来说,全表扫描的意思就是把聚簇索引中的记录都依次和给定的搜索条件做⼀下⽐较,把符合搜索条件的记录加⼊到结果集,所以需要 将聚簇索引对应的⻚⾯加载到内存中,然后再检测记录是否符合搜索条件。由于查询成本=I/O成本+CPU成本,所以计算全表扫描的代价需要两个信息:

聚簇索引占⽤的⻚⾯数

该表中的记录数 这两个信息从哪来呢?设计MySQL的⼤叔为每个表维护了⼀系列的统计信息,关于这些统计信息是如何收集起来的我们放在本章后边详细唠叨,现在看看怎么 查看这些统计信息哈。设计MySQL的⼤叔给我们提供了SHOW TABLE STATUS语句来查看表的统计信息,如果要看指定的某个表的统计信息,在该语句后加对应 的LIKE语句就好了,⽐⽅说我们要查看single_table这个表的统计信息可以这么写:

虽然出现了很多统计选项,但我们⽬前只关⼼两个:

Rows

本选项表示表中的记录条数。对于使⽤MyISAM存储引擎的表来说,该值是准确的,对于使⽤InnoDB存储引擎的表来说,该值是⼀个估计值。从查询结果 我们也可以看出来,由于我们的single_table表是使⽤InnoDB存储引擎的,所以虽然实际上表中有10000条记录,但是SHOW TABLE STATUS显示的Rows 值只有9693条记录。

Data_length

本选项表示表占⽤的存储空间字节数。使⽤MyISAM存储引擎的表来说,该值就是数据⽂件的⼤⼩,对于使⽤InnoDB存储引擎的表来说,该值就相当于聚 簇索引占⽤的存储空间⼤⼩,也就是说可以这样计算该值的⼤⼩:

Data_length = 聚簇索引的⻚⾯数量 x 每个⻚⾯的⼤⼩

我们的single_table使⽤默认16KB的⻚⾯⼤⼩,⽽上边查询结果显示Data_length的值是1589248,所以我们可以反向来推导出聚簇索引的⻚⾯数量:

聚簇索引的⻚⾯数量 = 1589248 ÷ 16 ÷ 1024 = 97

我们现在已经得到了聚簇索引占⽤的⻚⾯数量以及该表记录数的估计值,所以就可以计算全表扫描成本了,但是设计MySQL的⼤叔在真实计算成本时会进⾏⼀ 些微调,这些微调的值是直接硬编码到代码⾥的,由于没有注释,我也不知道这些微调值是个啥⼦意思,但是由于这些微调的值⼗分的⼩,并不影响我们分 析,所以我们也没有必要在这些微调值上纠结了。现在可以看⼀下全表扫描成本的计算过程:

I/O成本

97 x 1.0 + 1.1 = 98.1

97指的是聚簇索引占⽤的⻚⾯数,1.0指的是加载⼀个⻚⾯的成本常数,后边的1.1是⼀个微调值,我们不⽤在意。

CPU成本:

9693 x 0.2 + 1.0 = 1939.6

9693指的是统计数据中表的记录数,对于InnoDB存储引擎来说是⼀个估计值,0.2指的是访问⼀条记录所需的成本常数,后边的1.0是⼀个微调值,我们 不⽤在意。

总成本:

98.1 + 1939.6 = 2037.7 综上所述,对于single_table的全表扫描所需的总成本就是2037.7。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【合集一】每日一练30讲,轻松掌握Verilog语法

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 第一练&#xff1a;如何区分&#xff1c;&#xff1d;表示的含义&#xff1f; 题目&#xff1a;请描述以下两种方法产…

[C/C++]数据结构 循环队列

前言: 队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题 一:概念及结构: 1.循环队列概念 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队…

CART算法解密:从原理到Python实现

本文深入探讨了CART&#xff08;分类与回归树&#xff09;算法的核心原理、实现方法以及应用场景。文章首先介绍了决策树的基础知识&#xff0c;然后详细解析了CART算法的工作机制&#xff0c;包括特征选择和树的构建。接着&#xff0c;通过Python和PyTorch的实例代码展示了CAR…

重生之我是一名程序员 37 ——C语言中的栈溢出问题

哈喽啊大家晚上好&#xff01; 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢&#xff1f;栈溢出指的是当程序在执行函数调用时&#xff0c;为了保护函数的局部变量和返回地址&#xff0c;将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

一站式企业快递管理平台使用教程

因公寄件在企业中重要性的提升&#xff0c;催生出了企业快递管理平台。为什么这么说呢&#xff1f; 随着经济和快递行业的发展&#xff0c;因公寄件在企业中成了一件“常事”&#xff0c;寄文件合同、发票、节假日慰问品、样品等等&#xff0c;这种情况之下&#xff0c;因公寄件…

HDX读卡器牛羊管理RFID设备品牌

半双工HDX&#xff08;Half Duplex&#xff09;技术是ISO11784/5中规定的另一种标签与读写器之间的通讯方式&#xff0c;与全双工工&#xff08;FDX&#xff09;相比&#xff0c;HDX通常识别能力更强&#xff0c;有更大的识别距离。在HDX读写器的射频场与HDX标签响应期间关闭&a…

1. git入门操作

1. git入门操作 1、基本名词解释 图片 名词含义index索引区&#xff0c;暂存区master分支名&#xff0c;每个仓库都有个master&#xff0c;它作为主分支。branch其他分支&#xff0c;我们可以把master分支上的代码拷贝一份&#xff0c;重新命名为其他分支名work space就是我…

深眸科技聚焦AI机器视觉检测,驱动3C电子行业集成创新实现新需求

随着消费的升级及国家政策的助推&#xff0c;国内3C电子市场不断扩大&#xff0c;行业实现高速发展。近年来&#xff0c;3C电子产品持续迭代&#xff0c;生产工艺也逐渐复杂化&#xff0c;相关生产线定位组装、零部件检测、整机产品检测等环节&#xff0c;亟需使用具备较强适应…

electerm 跨平台的终端 /ssh/sftp 客户端

文章目录 electerm功能特性主题配色 electerm 每个程序员基本都离开SSH链接工具,目前市场上好用的基本都是收费的 给大家推荐一款国人开发的开源链接工具https://github.com/electerm/electerm 到目前为止star已经9.5K了,非常受欢迎 功能特性 支持ssh,telnet,serialport,本地和…

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记&#xff0c;如有错误&#xff0c;希望各位高手能指出&#xff0c;主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…

JOSEF约瑟 热过载保护继电器 JR36-160,整定值100-160A

系列型号 JR36-20 1.0-1.6A热继电器 JR36-20 0.25-0.35A热继电器 JR36-20 0.32-0.5A热继电器 JR36-20 0.45-0.72A热继电器 JR36-20 0.68-1.1A热继电器 JR36-20 1.5-2.4A热继电器 JR36-20 2.2-3.5A热继电器 JR36-20 3.2-5A热继电器 JR36-20 4.5-7.2A热继电器 JR36-20 …

季报含金量强势推高股价,满帮十年持续拉高数字货运生态天花板

经济活动越发密集&#xff0c;跑在路上的货车和司机们成为最忙碌的角色。11月20日美股盘前&#xff0c;数字货运龙头满帮集团&#xff08;YMM.US&#xff0c;以下简称&#xff1a;满帮&#xff09;发布2023年第三季度财报&#xff0c;其用户规模、业绩数据、履约单量等指标全面…

CMSIS-DSP实数FFT相关API(单精度浮点float)

目录 1. CMSIS-DSP的实数FFT 2. 频域上求模值 3. 如何求解相位 4. 对比python的求解过程 5. 在频域上以模和相角的方式还原信号 6. 求能量值 平台&#xff1a;STM32F407-DiscoveryCMSIS-DSP-V1.6.0 1. CMSIS-DSP的实数FFT 文件&#xff1a;\CMSIS\DSP\Source\Transform…

额温枪方案,MS8551,MS8601;MS1112,MS1100

鉴于测温的传感器信号非常微弱&#xff0c;需要用高精度、低噪声的运算放大器和高精度、低功耗的ADC。 运算放大器可供选择&#xff1a;MS8551 or MS8601&#xff0c;具有低失调&#xff08;1uV&#xff09;、低噪&#xff08;22nV√Hz &#xff09;、封装小等优点&#xff0c…

140. 单词拆分 II

140. 单词拆分 II Java错误代码&#xff1a;不该回溯数组的&#xff0c;回溯数组是以固定顺序来的&#xff0c;应该回溯字符串&#xff01; class Solution {StringBuilder sb;List<String> list;List<String> tmp;private String getString() {StringBuilder str…

云服务器-从零搭建前后端服务(自动化部署、数据库)

免密登陆 第一步就是能免密快速登录到服务器 可以直接使用 FinalShell、MobaXterm 或 XShell 等进行连接 如下方法是直接用命令行操作 安装 Remote - SSH 插件&#xff0c;即可在 VSCode 中进行配置 配置别名快速登录&#xff1a;ssh-config&#xff08;也可以直接找到本机…

Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试&#xff0c;unittest模块特性、大致流程、源码及实战例子这几个模块&#xff0c;有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…

【腾讯云云上实验室】探索保护数据之盾背后的安全监控机制

当今数字化时代&#xff0c;数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及&#xff0c;如何保护数据的安全性和隐私性成为了迫切的需求。 今天&#xff0c;我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…

酵母双杂交服务专题(一)

酵母双杂交系统是一种在酵母这种真核生物模型中执行的实验方法&#xff0c;用于探索活细胞内部蛋白质间的相互作用。这种技术能够敏感地捕捉蛋白质间的细微和短暂相互作用&#xff0c;通过检测报告基因的表达产物来实现。作为一种高度灵敏的技术&#xff0c;酵母双杂交系统被广…

FreeRTOS-FreeRTOS概述

FreeRTOS FreeRTOS目录结构 移植过程 在工程中创建freertos文件夹&#xff0c;在freertos文件夹中创建src文件夹、inc文件夹、port文件夹。 freertos/src存放源码freertos/inc存放头文件freertos/port存放移植平台的相关文件 复制内存管理文件&#xff1a;复制FreeRTOS/Sourc…