MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程

MySQL 的架构共分为两层:Server 层和存储引擎层

  • Server层负责建立连接、分析和执行SQL
  • 存储引擎层负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎,MySQL5.5以后默认使用InnoDB,默认索引类型是B+树。
2.1.1.1. 连接器:

MySQL基于TCP协议传输需要经过三次握手,连接后开始验证用户名和密码,通过后获取用户权限。管理员中途修改用户权限不会影响已存在连接的权限,新建立的连接使用修改后的权限。空闲连接超过8小时后会自动断开, kill connection + id命令可以手动断开空闲连接,MySQL支持的最大连接数是151个。

MySQL也有短连接接和长连接的概念

    • 短连接:连接->执行->断开 ......
    • 长连接:连接->执行->执行->执行->......->断开

长连接断开之前一直占用内存,累计太多导致内存占用太多,可能会被系统强制杀掉,造成服务异常。

解决长连接占用内存:

    • 定期断开长连接
    • 客户端主动重置连接,MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口,在执行一个很大的操作后,通过调用mysql_reset_connection() 函数来重置连接,过程不需要重连和权限验证。
2.1.1.2. 查询缓存:

如果是查询操作,先查询缓存,如果缓存命中直接返回结果给客户端,未命中就向后执行。MySQL 8.0 开始删除了server 层的查询缓存,因为命中率较低。

2.1.1.3. 解析SQL:

SQL语句正式执行前,先由解析器做两件事。

  1. 词法分析:

首先会识别出关键字,例如,SQL语句 select username from userinfo,解析后获得4个token,有两个Keyword分别是select和from。

关键字

非关键字

关键字

非关键字

select

username

from

userinfo

  1. 语法分析:

根据语法规则判断该SQL语句是否满足,通过后会构建语法树,方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。

2.1.1.4. 执行SQL

每条SELECT 查询语句流程主要可以分为下面这三个阶段:

    • prepare 阶段,也就是预处理阶段;
    • optimize 阶段,也就是优化阶段;
    • execute 阶段,也就是执行阶段;
  1. 预处理器:

在这里检查查询语句中的表或者字段是否存在,将select * 中的 *,扩展为表中的所有字段。表或字段如果不存在会在这里报错。

  1. 优化器:

优化器为查询语句指定一个执行计划,例如,表里有多个索引优化器会根据索引基数选择一个较适合的索引。

  1. 执行器:

执行器是真正执行语句的,执行过程会和存储引擎交互,交互以记录为单位。执行过程有三种:

      • 主键索引查询
      • 全表扫描
      • 索引下推

主键索引查询:

  • 执行器第一次查询,调用指向InnoDB引擎索引查询接口的read_first_record 函数指针,然后把条件给存储引擎,来定位符合条件的第一条记录。
  • 存储引擎通过主键索引的 B+ 树结构定位到第一条记录,记录存在,将记录返回给执行器。不存在返回错误然后查询结束;
  • 执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,符合则发送给客户端,如果不符合则跳过该记录。
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,因为不是第一次查询了,会调用 read_record 函数指针指向的函数,如果都查询完了会指向一个永远返回-1的函数,然后退出循环结束查询。

至此,这个语句就执行完成了。

全表扫描:

如果查询语句条件没有使用索引,优化器会决定用全表扫描的方式。

  • 执行器第一次查询,调用指向InnoDB引擎全扫描接口的read_first_record函数指针,让存储引擎读取表中的第一条记录。
  • 执行器判断这条记录是否符合条件,不符合就跳过这一条,符合就将记录发给客户端。(Server 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录)
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,接着向存储引擎层要求继续读刚才那条记录的下一条记录,存储引擎把下一条记录取出后就将其返回给执行器(Server层),执行器继续判断条件,不符合查询条件即跳过该记录,否则发送到客户端;
  • 一直重复上述过程,直到存储引擎把表中的所有记录读完,然后向执行器(Server层) 返回了读取完毕的信息;
  • 执行器收到存储引擎报告的查询完毕的信息,退出循环,停止查询。

至此,这个语句就执行完成了。

索引下推:

索引下推能够减少二级索引(基于非主键字段构建的索引)在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。

总结:使用组合索引时,可能会有部分字段无法使用到索引,这时可以使用索引下推来减少回表操作,索引下推就是将所有查询条件都判断完成后再回表,没有使用索引下推就只判断了使用到索引的字段,其余字段的查询条件还需要回到Server层来判断。

组合索引当遇到范围查询 (>、<) 就会停止匹配,也就是 最左侧的字段能用到联合索引,但是后面字段则无法利用到索引

不使用索引下推(MySQL 5.6 之前的版本)时,执行器与存储引擎的执行流程是这样的:

  • Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到符合最左侧查询条件的第一条记录;
  • 存储引擎根据二级索引的 B+ 树快速定位到这条记录后,获取主键值,然后进行回表操作,将完整的记录返回给 Server 层;
  • Server 层再判断该记录的后续的条件,如果成立则将其发送给客户端;否则跳过该记录;
  • 继续向存储引擎索要下一条记录,存储引擎在二级索引定位到记录后,获取主键值,然后回表操作,将完整的记录返回给 Server 层;
  • 如此往复,直到存储引擎把表中的所有记录读完。

没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,接着 Server 再判断该记录是否符合后续的查询条件。

使用索引下推后,判断后续查询条件的工作交给了存储引擎层,过程如下 :

  • Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位符合最左侧查询条件的第一条记录;
  • 存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的查询条件是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。
  • Server 层再判断其他的查询条件是否成立,如果成立则将其发送给客户端;否则跳过该记录,然后向存储引擎索要下一条记录。
  • 如此往复,直到存储引擎把表中的所有记录读完。

如果执行计划里的 Extr 部分显示了 “Using index condition”,说明使用了索引下推。

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

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

相关文章

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …

大数据组件之Storm详解

Storm 是一个免费并开源的分布式实时计算系统&#xff0c;具有高容错性和可扩展性。它能够处理无边界的数据流&#xff0c;并提供了实时计算的功能。与传统的批处理系统相比&#xff0c;Apache Storm 更适合处理实时数据。 让我们深入了解一下 Storm&#xff1a; 1.Storm 简介…

2024-04学习笔记

1.sql优化-子查询改为外连接 1.改之前 改之前是这样&#xff0c;那针对查出来的每一条数据&#xff0c;都要执行一次箭头所指的函数 执行的sql很慢 2.改之后 改之后是这样&#xff0c;整体做外连接&#xff0c;不用每一条都再执行一次查询 执行时间缩短了好几倍 2.Mybatis中…

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统&#xff0c;你都会看到一些登录消息、警告或关于你已登录服务器的信息&#xff0c;如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

c#数据库: 5.删除指定年级的学生信息

将成绩为100分的学生信息从学生信息表中删除。删除前的学生信息表如图: using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks;namespace StudentDelete {internal class Progr…

探索设计模式的魅力:主从模式与AI大模型的结合-开启机器学习新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索主从模式与AI大模型之旅✨ &#x1f31f;Hey, tech enthusiasts! 你是否还在追…

列表页和表单页:移动UI设计的噩梦,该如何破?

hello&#xff0c;我是大千UI工场&#xff0c;列表页和表单页在网页UI中非常常见&#xff0c;极易处理&#xff0c;如果挪到了移动UI上&#xff0c;简直就是设计的噩梦&#xff0c;本文分析噩梦成因&#xff0c;给出破解之道和实际案例。 一、列表页——移动UI设计的噩梦 列表页…

Macs Fan Control Pro for mac激活版:macOS 平台的风扇控制软件

Macs Fan Control Pro是一款用于 macOS 平台的风扇控制软件&#xff0c;它允许用户监控和调整 Mac 电脑的风扇转速。以下是该软件的一些特点和功能&#xff1a; Macs Fan Control Pro for mac激活版下载 风扇监控&#xff1a;Macs Fan Control Pro 提供实时的风扇转速监控&…

2024.4.29

模板类实现顺序栈 #include <iostream>using namespace std; template <typename T> class Seqlite{T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> //头插函数 void S…

Chrome 网络调试程序 谷歌网络调试 network

目录 1.网络面板总览2.概况了解3.Waterfall接口排队等待时间4.关注请求接口的Size,可能是占据内存溢出的接口5.过滤器一栏 fetch/xhr 什么意思6. Stalled 什么意思7.Queueing 什么意思8.Queueing和Stalled之间什么关系9.为什么会有阻塞状态10.Time列是pending 什么意思 1.网络面…

Sublime Vim模式配置:q关闭当前标签页

在Sublime安装目录下的->Packages文件夹下新建User文件夹创建文件Vintage.sublime-commands 路径为Sublime安装目录->Packages->User->Vintage.sublime-commands文件内容如下[{"caption": ":w - Save","command": "save"}…

面试ssss

深拷贝和浅拷贝 深拷贝和浅拷贝是关于对象&#xff08;包括数组&#xff09;复制的两个概念。 浅拷贝在复制对象属性的时候&#xff0c;复制的是指针&#xff08;引用&#xff09;&#xff0c;所以&#xff0c;修改目标对象的属性值会影响到原对象的对应属性值 obj。assign …

Hadoop之路---伪分布式环境搭建

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;创建完hado…

Ansible-Tower安装破解

主机IP地址版本Ansible192.168.169.2042.9.1Tower192.168.169.2043.6.2 基础环境 systemctl disable firewalld --now && setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config mv /etc/yum.repos.d/CentOS-* /tmp/ curl -o /etc/yum.repo…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写&#xff0c;默认第一个字段就是index0&#xff0c;以此类推。千万注意&#xff0c;要么全部不写&#xff0c;要么全部用index&#xff0c;要么全部用名字去匹配。…

Unity 实现原神中的元素反应

一、元素反应 原神中共有七种元素&#xff0c;分别是水、火、冰、岩、风、雷、草。这七种元素能互相作用 Demo下载&#xff1a;Download 元素反应表格图示&#xff0c;可能不够精准 /火水雷冰草岩风绽放原激化火/蒸发超载融化燃烧结晶扩散烈绽放/水蒸发/感电冻结/碎冰绽放结晶…

mysql优化面试总结

mysql优化 和 mysql优化之索引 两篇文章有大量的实验性的内容&#xff0c;我暂时没时间理解&#xff0c;把八股部分总结到这篇文章中&#xff0c;方便记忆 我们为什么要对sql进行优化 我们开发项目上线初期&#xff0c;由于业务数据量相对较少&#xff0c;一些SQL的执行效率对…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营带来了极大便利&#xff0c;越来越多的企业依赖网络开展各项工作业务&#xff0c;网络也大大提升了企业的生产运营效率&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全…