SQL优化-深入了解SQL处理流程原理(Server层与存储引擎交互、数据管理结构)

news2025/1/16 14:07:58

做SQL优化的前提就必须要清楚当一个SQL被发送到Mysql时,它的处理流程。下面通过一个SQL优化分析过程来详细了解Mysql对SQL执行流程原理。

1、Mysql架构
在上篇文章中已经做了简单架构介绍,Mysql架构分为两个大的组件:Server层、存储层

Mysql服务层主要工作为连接器、查询缓存、解析器、优化器、执行计划、执行器等

存储引擎层: 存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互。

可以看出来Mysql架构中Server层和存储引擎层是完全解耦独立运行的组件,所以MySQL存储引擎是插件式的,即可以选择不同的引擎使用,甚至可以自己写一个。

服务器中的查询执行引擎(执行器)通过接口与存储引擎进行通信。

简单的说,存储引擎本身是一个比较单纯的服务组件,它只负责与硬件交互,进行数据的读取和存储工作,而这一切的读写行为都是按照Server层提供执行计划来实施。

2、SQL执行流程分析

通过一个SQL优化来了解下详细流程:

select * from project where tenantsid=286478108025408 and name = '测试专案20219999' and sales_code ='psm02';

根据表结构和SQL可以得到相关分析资讯,借此来深入了解执行流程:

  • 1、这个SQL会使用到index_01索引,因为不满足最左原则所以只会使用到tenantsid栏位。
  • 2、因为name条件也是存在于索引index_01中的,Mysql5.7之后支持了索引下推优化,所以这块会使用到ICP,来进行优化。
  • 3、sales_code ='psm02'是非索引栏位的附加条件,使用不到索引,那就需要进行数据过滤。
  • 4、select * 所以需要回表操作

流程步骤:

1、Sever层通过连接器接收到SQL请求后,优先查看缓存是否由满足条件的数据,没有则继续..

2、通过解析器分析,生成语法树  .... 优化器(不关注,不说了)

3、Sever层最终会生成一个执行计划,执行器就根据执行计划来调用存储引擎进行交互。

执行计划:

可以看出来,执行计划中几乎已经将整个的执行过程交代的很清楚,后续就是单纯的按照执行计划来交互执行:

  1. Server层会调用存储引擎API,告诉它根据tenantsid栏位查询project的index_01索引树,同时别忘记了查询完了使用index_condtion进行过滤......说白了就是给出执行计划让它按计划整
  2. 存储引擎首先根据索引条件tenantsid,去索引树index_01进行数据检索,获取到满足条件的索引数据页,获取到第一条记录。
  3. 然后检查index_condition是否有需要过滤的条件,这里通过name条件进行过滤(ICP关键)。于是对这一条纪律进行name过滤,是否满足name='***' ,如果不满足,舍弃这条纪律,进行下一条记录查找。
  4. 如果满足name条件,发现当前索引树栏位不能满足需要的栏位used_columns,于是根据id进行回表查询,得到需要的栏位资讯
  5. 将这条数据返回给Sever层。需要注意的是,到此是第一个记录的处理流程,所以需要清楚的是server层和存储层是一条一条数据处理交互的,相当于一个loop。
  6. Sever层拿到该数据后,再检查是否有附加条件需要过滤attached_condition,这里需要根据sales_code 过滤
  7. sever层完成过滤后将该数据返回给客户端。(所以这就是为什么我们在客户端做大数据量查询时,手动停止查询后,只返回一部分数据过来原因)

上面交互流程涉及到了索引查询、ICP、回表、数据过滤等过程,当然Mysql远不止这些流程。

3、SQL优化

现在清楚了当前SQL的执行流程,我们可以知道:

1、ICP原理:server层在生成执行计划时,会将不能通过索引查询,但是可以利用索引结果进行过滤出的条件下推到存储引擎进行数据过滤,这样可以进一步过滤掉数据,减少后续回表的操作。一般使用到了索引下推可以通过执行计划extra查看,如果有use_index_condition表示进行了索引下推。

2、回表原理:因为索引树中叶子节点数据不能满足需要的栏位,所以需要通过主键ID,到主键索引中查询,这是IO操作,所以要尽量的减少这样的回表操作。

3、数据过滤:通过执行索引无法直接过滤的条件,server层会对其进行再次过滤操作,一般在执行计划中extra中存在using where表示需要进一步数据过滤行为。

4、索引覆盖:因为索引查询结果不能涵盖需要的栏位,所以才需要回表操作回去到需要的栏位信息,如果二级索引已经包含了需要的栏位,这里就不需要回表查询。

分析了执行计划,也了解了原理,接下来优化就变得简单了,

  • 调整索引字段顺序,满足最左原则,这里可以将索引调整为(tenantsid,name,code)
  • 减少回表:这里不要使用select * ,可以根据需求将需要的栏位进行select,比如select  tenantsid, name ... 如果回表量比较大,这里就可以考虑进行索引覆盖。
  • 对attached_condition 建立索引:因为sales_code没有建立索引,才会导致需要额外的过滤操作,所以将当前字段,添加到index_01中,需要注意的是(tenantsid,name,sales_code,code) 索引查询,(tenantsid,name,code,sales_code) 索引下推

调整索引为index02(tenantsid,name,sales_code,code) 

select  tenantsid,name from project where tenantsid=286478108025408 and name = '测试专案20219999' and sales_code ='psm02';

可以看出来查询成本从702降到了1.2

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

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

相关文章

vue3项目 - Eslint 配置代码风格

Eslint 自定义配置 总结: Prettier (代码规范的插件,格式化 )---> 美观 Eslint (规范、纠错、检验错误 )-----> 纠错 首先,禁用 Prettier 插件,安装 ESLint 插件&#x…

【量化金融】证券投资学

韭菜的自我修养 第一章: 基本框架和概念1.1 大盘底部形成的技术条件1.2 牛市与熊市1.3 交易系统1.3.1 树懒型交易系统1.3.2 止损止损的4个技术 第二章:证券家族4兄弟2.1 债券(1)债券,是伟大的创新(2&#x…

案例147:基于微信小程序的酒店管理系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

重构云计算,打造 AI 原生时代的云计算产品与技术体系,实现 AI 零距离

概述 自 ChatGPT 大模型横空出世以来,文心一言、通义千问等诸多大模型接踵而来,感觉这个世界每天都在发生着翻天覆地的变化。 今年很有幸,参与了云栖的盛宴,当时被震惊到瞠目结舌,12 月 20 日百度云智能云智算大会&a…

使用Python自己写了一个Renpy 汉化插件

之前看了很多教程都是Renpy怎么解包、怎么创建翻译文件,对翻译过程没有过多讲解,就根据翻译文件写了一个小程序,如果需要的可以自行下载使用。 使用方法: 1.按照正常unrpa的解包方式renpy进行解包; 2.使用renpy-sdk…

Bloom过滤器

Bloom过滤器 一、概述二、原理三、优缺点1. 优点2.缺点 四、Bloom过滤器在比特币中的应用五、项目应用步骤1. pom.xml引入依赖2. 样例代码 六、Java版简易实现 一、概述 Bloom过滤器是一个允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜…

新型智慧城市解决方案:PPT全文56页,附下载

关键词:智慧城市解决方案,智慧城市管理技术,智慧城市建设,数字城市建设 一、智慧城市宏观形势 1、政策支持:出台了一系列政策,鼓励和支持智慧城市的发展。这些政策为智慧城市的建设提供了政策保障和资金支…

Confluent 与阿里云将携手拓展亚太市场,提供消息流平台服务

10 月 31 日,杭州云栖大会上,阿里云云原生应用平台负责人丁宇宣布,Confluent 成为阿里云技术合作伙伴,合作全新升级,一起拓展和服务亚太市场。 本次合作伙伴签约,阿里云与消息流开创领导者 Confluent 将进一…

Zabbix6 使用Agent2实现证书监控的详细步骤

目标 我们的目标是通过获取网站的证书信息来实现网站证书监控。 使用agent2的key 只需使用其中的key,就能实现我们的目标功能。然而,由于它返回的是json格式的数据,我们需要根据数据来配置监控项目(item)和触发器&am…

Jenkins自动化部署之后端

准备工作参考本人另外几篇Jenkins相关的文章 新建任务 添加参数配置 字符串参数:分支名称 多选框:项目名称(Extended Choice Parameter插件必备,插件安装参考我另外的文章) 这个分割规则自定义。只要根据Jenkins…

Linux Centos-7.5_64bit 系统等保测评内容

一、身份鉴别 a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换 指引:1.观察管理员登录方式。2.查看系统配置,记录配置参数。(more /etc/pam.d/system-auth、more /et…

Conda命令、Miniconda3基础安装使用教程

Conda命令、Miniconda3基础安装使用教程 Minicodna3下载地址:https://docs.conda.io/projects/miniconda/en/latest/index.html 正常安装完毕后,出现conda的控制台: 默认的源下载太慢,换清华源,依次执行以下命令&…

Python内置类属性__class__属性的使用教程

概要 Python作为一种高级编程语言,提供了丰富的功能和灵活性,使得开发人员能够更加方便地处理各种任务。其中一个强大的功能是内置类属性__class__属性。本文将详细介绍__class__属性的用法,帮助读者更好地理解和利用这一功能。 第一部分&am…

直播种类之VR全景直播

VR全景直播是一种结合虚拟现实技术和直播的全新体验。通过全景相机拍摄,观众可以身临其境地感受直播现场的氛围和真实感,提供逼真的观看体验。 VR全景直播的优势在于: 1.身临其境的观看体验:观众可以像真的在现场一样,通过虚拟现实设备探索…

使用Ubuntu22+Minikube快速搭建K8S开发环境

安装Vmware 这一步,可以参考我的如下课程。 安装Ubuntu22 下载ISO镜像 这里我推荐从清华镜像源下载,速度会快非常多。 下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.3/ 如果你报名了我的这门视频课程&#xf…

九州金榜家庭教育面对孩子负面情绪父母如何做?

情绪管理这个词越来越高频的出现在各个场合,越来越多的人注意到了情绪对人的影响,情绪可以让一个平时理智的人冲动的犯下错误,可以让一个懦弱的人充满勇气,可以让一个聪明的人失去判断,可以让一个消极的人重新找回积极…

业绩的非线性特征——捕获指标的改进及国内基金行业的证据

摘要及声明 1:本文主要对捕获能力指标进行改进,并且利用改进的指标进行实证检验; 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的一孔之见,若有不同见解欢…

分享70个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 源码下载链接:https://pan.baidu.com/s/1uyWfeUuO_4jRbAEw825qRw?pwd6666 提取码:6666 项目名称 CRUD is ReallyU…

交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM) 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于KNN-BiLSTM的交通流预测(对…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一,而公考常识题作为公务员考试的重要组成部分,对于考生来说具有很高的分值。在这一模块的复习中,有以下几点可以帮助考生提高学习效率,一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…