小美,这篇查询SQL执行流程你一定要看

news2024/11/28 14:37:38

前言

宿舍里,小A兴致满满的将刚写好的查询SQL执行流程文章通过微信发给小美,回想起昨晚透过窗户意外看到小美哭的梨花带雨,问过她室友才知道竟然是因为面试被SQL执行流程给难住了。心里暗自下决心:作为小美背后的男人,我绝不允许!

另一边小美收到备注为备胎N号-小A发的消息下意识就要关掉,却模糊间看到了查询SQL执行流程几个关键字。想起被面试官吊打的情景,按耐不住打开了文章。发现根本停不下来,忍不住两眼直冒金光。

正文开始

MySQL 是我们工作中必不可少的技术栈,怎么都避不开它。在使用 MySQL 时,我们最经常接触的就是DML语句,但是一条DML语句是如何执行的你了解嘛?接下来我们就以查询语句为例,详细解析它在 MySQL 中的执行流程。

上图是一条查询SQL的主要流程,简单概述下:

  1. 同 MySQL 建立连接,并进行权限认证和校验

  2. 根据 SQL 语句查询缓存,命中则直接返回

  3. 未命中则对 SQL 进行词法、语法解析,异常则抛出错误

  4. 生成执行计划,进行索引选择(不一定是最优解)

  5. 执行器操作存储引擎执行 SQL 语句,返回结果

可以看出主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心功能。而存储引擎负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

连接器

第一步就需要与连接器打交道,一般通过以下命令建立链接:

mysql -h ip -P port -u user -p password

账号和密码校验通过后,会到权限表中查出用户所拥有的权限。后续的权限校验都会据此来作出判断,相当于一个权限快照,后续的权限修改不影响已成功建立连接的用户。

可以通过 SHOW PROCESSLIST; 命令查看当前连接,如果连接长时间处于 Sleep,到达 wait_timeout(默认8小时),连接器会自动将连接主动断开

断开连接后请求就会收到一个错误提醒,需要重新建立连接。而如果客户端持续有请求 MySQL 则会重复使用同一个连接(长连接)。不能每次执行完几条 SQL 语句就断开连接,下次查询再重新建立(短连接)。建立连接的过程比较复杂,持续使用短连接会影响系统性能。在实际开发过程中,我们都会使用连接池来维护连接,完成 SQL 语句执行。

使用长连接可能会遇到MySQL内存飞涨(临时使用的内存是管理在连接对象中,会在连接断开时才释放);如果长连接过多,会导致内存占用过大,被系统强制 Kill 掉(Out Of Memory),导致 MySQL 发生异常重启。通常有两种解决方式:

  • 定期断开长连接,在系统执行完一个较大内存查询后

  • 如果当前 MySQL 版本大于等于5.7,可以通过通过mysql_reset_connection重新初始化连接资源。不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

建立连接后,Mysql 接收到客户端的查询语句,会先查询缓存。如果该查询语句之前执行过(需要语句完全一致),则其结果可能被缓存下来,后续命中缓存的情况下可以直接返回给客户端。

看上去查询效率很高,但在实际使用中通常会关闭该功能(8.0版本后删除了该功能)。因为缓存失效概率非常大,只需要对表数据做更新就会导致该表的所有缓存都失效。可通过命令将 query_cache_type 设置成 DEMAND,关闭该功能。

分析器

进入到分析器后,接下来才是真正进入执行 SQL 流程。

首先会进行词法分析,一条 SQL 语句通常由很多个字符串、空格拼接而成,会把字符串中的关键字、表名、字段名等拆解出来

进行语法分析时,将一条 SQL 语句生成一个数据结构,这个数据结构我们把它叫做解析树(select_lex)。接着判断其语法规则是否符合,如果服务器进程认为SQL语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。

最后进行语义解析,判断对应的表名、字段名、视图等等是否在数据库中存在,不存在就直接报错给用户。

优化器

优化器主要是对当前执行语句进行优化,得到当前形势下最有效的执行路径,生成该语句的执行计划。

往往实际运用中,一个表会存在多个索引。每个 SQL 语句可能满足多个索引的使用规则,优化器是在表里面有多个索引的时候,决定使用哪个索引或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

现在默认使用的是CBO(成本优化器),从目标诸多的执行路径中选择一个成本相对最小的执行路径来作为执行计划。这里的成本是基于查询语句使用不同索引时对当前系统的IO、CPU等消耗来进行估算,从而选择一个成本最低的执行计划

执行计划

到达最后执行时,会先做用户的权限校验,判断是否有当前表、列等数据的查询权限。

权限没问题就会调用存储引擎提供的接口查询数据。例如用InnoDB引擎接口去扫描这个表的第一行,判断职业为程序员,如果不是则跳过,如果是则将这行存在结果集中 调用引擎接口取下一行,重复相同的逻辑判断,直到取到这个表的最后一行。

最后执行器将满足条件的所有数据汇总成一个结果集返回给客户端

总结

小美看完内心忍不住感慨,小A平时看着呆头呆脑的,还是有点东西啊!以后要多跟他交流,面试官还不得对我刮目相看。(默默将备胎N号-小A升级为备胎一号-小A

希望对你也有帮助,SQL 执行流程是面试经常被问的问题,看完这篇文章妈妈再也不用担心面试官问你这题了。如果大家对 MySQL 其他问题感兴趣或者面试被问到回答不好的(也不局限于 MySQL,可以是 Java 各方面),可以留言或私信,根据反馈持续更新。

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

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

相关文章

MongoDB Node 驱动简介

MongoDB Node 驱动介绍 1. MongoDB数据库连接指南 使用原生的mongodb Node驱动连接MongoDB数据库。 1.1 数据库连接URI 数据库连接URI是一个指明了数据库地址、名称、用户名、密码的字符串,类似于网页链接。 1.2 Node驱动安装 使用Npm或者Yarn安装数据库驱动程…

LeetCode题解13 (102,226) 二叉树的层序遍历,翻转二叉树

文章目录二叉树的层序遍历(102)代码解答:翻转二叉树(226)代码解答:二叉树的层序遍历(102) 思路(前序,后序,中序遍历): 二叉树的层序遍历不同于二叉树的前序,后序,中序遍历,层序遍历是将二叉树的每一层从根部开始进行遍历, 将每一层的节点都放到1个集合中…

推断统计 | 学习笔记

一.概率与概率分布 概率论:为解决不确定性问题提供方法 1.随机事件及其概率 基本概念 试验:在相同条件下,对事物或现象所进行的观察。特点是可以在相同的条件下重复进行;每次试验的可能结果不止一个,但试验的所有可…

l2a股接口的委托队列有什么作用?

l2a股接口的委托队列是Level 2行情特有的功能,如下图,在传统交易页面中,可以看到个股封板涨停有35994手,但是不能具体看到各笔委托单的数量,不利于我们甄别究竟是主力在强势封板还是散户在跟风。 而在Level 2行情中可以…

高性能、强稳定的工业级服务器冗余方案是怎样的?

前言 服务器是工业数据采集与上位机进行通信的枢纽,一旦遭到攻击或者出现连接不稳定的情况,导致断开连接,工厂就会出现非计划性的停机停产。这种情况带来的损失是难以估量的。因此,为了保障自动化生产的稳定可控,服务…

关于Detectron库预训练模型的权重转换

关于Detectron库预训练模型的权重转换 最近在调试代码的过程中涉及到detectron库的使用,在模型训练前,主干网络的部分需要加载预训练模型,但是原始的预训练模型在detron库中的代码是不能直接使用的,需要通过转换工具对模型的键值…

Sentinel服务熔断降级

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供…

Redis Lua脚本 Debug

Redis 编程接口之Lua脚本 Redis 使用Lua脚本和Redis Functions扩展其功能。Redis提供编程接口,允许开发者在服务器执行自定义的脚本,对于不同的版本,实现的方式略有不同 Redis 7 及以上版本 使用Redis Functions 管理、运行脚本Redis 6.2及…

【20天快速掌握Python】day02-数据类型转换及运算符

1、数据类型转换 函数说明int(x [,base ])将x转换为一个整数float(x)将x转换为一个浮点数str(x)将对象 x 转换为字符串bool(x)将对象x转换成为布尔值转换成为整数 print(int("123")) # 123 将字符串转换成为整数 print(int(123.78)) # 123 将浮点数转换成为整数 …

腾讯云存储产品全线升级,满足更多高性能存储场景

数字经济时代,诞生了海量数据资源,促使数据存储技术也在不断推陈出新。12月1日,在2022腾讯全球数字生态大会存储专场上,腾讯云发布了多款云存储产品能力上新,并对分布式存储、高性能存储、日志大数据、云原生数据湖等产…

CMSIS hal库 标准库 pack(芯片支持包)

ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层 CMSIS英文全称Common Microcontroller Software Interface Standard,☞通用微控制器软件接口标准&a…

OAuth2.0介绍

1. OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本&#xff0…

【蓝桥杯选拔赛真题51】Scratch赛车训练 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch赛车训练 一、题目要求 编程实现 二、案例分析 1、角色分析

python解决 某文库禁用文段批量下载 并保存到文档

嗨害大家好鸭! 我是小熊猫鸭~ 大家是不是在写毕业论文的时候 需要参考某一段的内容 要用到复制粘贴,但是吧,某文库就需要付费, 就老难受了… 我们今天就来解决这个"老难受" 源码、资料点击此处 环境使用&#xff1…

项目实战案例丨教辅机构信息化平台跟着这个做

一. 基本简介 最近正值计算机专业的小伙伴忙着整理毕业设计,有不少童靴问辉哥,有没有合适的项目作为毕业设计项目。恰好辉哥这里就有一个适合作为毕设的项目,那么辉哥就写一篇文章,聊聊这个项目,希望可以对有需要的你…

照片怎么制作动态照片?这篇文章教会你如何制作

大家不知道有没有在网上刷到过一些本来是静态的照片,可照片里的局部却能够动起来的动态图片,我看完后觉得这种特效很神奇,既有趣又不会有违和感。那你想知道动态照片怎么制作吗?今天我就来给大家介绍一下制作动态图片的具体方法&a…

基于JWT用户认证分析

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了。 于是我们的程序就不知道谁是谁,就要再验证一…

Spring Security 认证授权(一)

1.基本概念1.1.什么是认证 进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微…

大二毕设.1-学生信息管理系统

目录 技术选型: 功能概括: 可扩展性良好,添加其余操作无非是多加点信息,重复编码改数据罢 版本: 基本演示 功能实现讲解 登录校验 可调整每页条数的分页显示与增删查改 不会造成偷窃的部分web代码 技术选型: 前端: Vue Element UI后端: Spring…

喜报|众享链网荣获第二届中国可信区块链安全攻防大赛优秀案例奖

近日,第二届中国可信区块链安全攻防大赛决赛在成都成功举办并圆满落幕。经过预赛初审、预赛复审的层层选拔,众享链网脱颖而出,成功进入赛道三“原创自主区块链平台优秀应用案例评选比赛”总决赛环节,荣获优秀案例奖,入…