一条sql语句执行的流程

执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。在腾讯面试中回到过这样的,一条 sql 语句的执行流程。

select * from product where id = 1;

对于mysql的架构分层图:

alt

mysql 架构分成了 Server 层和存储引擎层:

Sever 层 负责建立连接、分析和执行 sql 语句。 一些核心功能模块比如解析器生成语法树,预处理器、优化器、执行器这些。

在存储引擎层:支持 InnoDB 存储引擎。底层使用的是 B+树。mysql5.5 之后 InnoDb 成为默认的存储引擎了。

第一步建立连接

通过连接器和 mysql 的客户端建立连接,连接的过程需要使用 TCP 三次握手。

msyql -u root -p

在输入对应的密码就登录成功了

查看 mysql 当前有多少连接数量:mysql 默认是 151 条连接。可以设置

show processlist;

执行了一次查询就算建立连接了,连接默认是八个小时,超过这个数量就会自动的断开。

alt

连接数太多了

alt

删除了查询缓存,在 mysql8 之前查询的内容会缓存起来。如果有插入操作,那么缓存就要删除,这样效率并不会很高。

第二部解析 SQL

解析器会做两件事情,第一个是词法分析:

mysql 会根据你输入的字符串识别出关键字出来,比如 select username from userinfo 会解析出来 4 个 token,有两个 key word,是 select 和 from。

第二个进行语法的分析:

根据词法分析的结果,语法解析器根据语法规则判断输入的 sql 是否满足 MYSQL 的语法。没有问题就构建出来 sql 语法树。

构成一个这样的语法树。

alt

https://blog.csdn.net/zhang24360/article/details/128963299 语法树的详细内容

对于这样的一颗语法树使用后序遍历,左右中,这样就能组合成一条 sql 语句出来了。

第三步执行 sql

分为三个阶段 预处理 优化阶段 执行阶段

预处理阶段:

检查 sql 查询语句中的表或者字段是否存在。

将 select * 中的*符号扩展为表上的所有列。

优化阶段:

需要确定一个执行计划,比如现在有多个索引到底用哪一个索引。确定 sql 查询语句的执行方案。

想要知道选择哪个索引可以在查询语句之前加一个 explain 命令,会展示书 sql 语句的查询计划。

alt

优化器是用来选择索引的。查询主键索引的成本会更大,因为主键索引存储的所有数据的值。

在上面的 sql 语句中查询主键索引 B+树的成本会高于查询二级索引 B+树的成本,优化器会基于查询成本考虑选择代价最小的普通索引。

执行阶段:

这个时候 server 层要去和存储引擎层进行交互了:

比如有 全表扫描(b+树支持范围查找)、主键索引查询、索引下推。

索引下推

alt

对于联合索引 遇到> 或者小于< 就会停止匹配。

在 mysql5.6 之前,定位到 age>20 的第一条记录,然后找到主键值,进行回表查询,将完整记录 Server 层,在判断是否相等。 这样每一次查询二级索引记录都要进行回表。

alt

第一次定位到 age>20 的时候,先判断后面的 reward 是否等于 1000.如果成立才进行回表操作。

alt

索引下推是减少二级索引的回表查询操作,提高查询的效率。将 Server 层做的一些事情交给了存储引擎层去做。

查询 age>20 的时候遇到>联合索引就会失效了,这个时候就需要回表查询 reward 是否是等于 1000 的。

这样效率太慢了,直接在存储引擎层去判断 reward 是否等于 1000. 如果成立在回表给 Server 层操作。 alt

最后 sql 执行完成之后返回字节流数据

#sql##mysql执行流程#
牛牛的面试专栏 文章被收录于专栏

牛牛的面试专栏,希望自己在25年可以拿到一份大厂的SP Offer 你的点赞和收藏都是我持续更新的动力

全部评论
😝
点赞 回复 分享
发布于 04-17 17:13 湖南
写的真好
点赞 回复 分享
发布于 04-05 16:07 安徽

相关推荐

#&nbsp;#&nbsp;1.&nbsp;一面4.15&nbsp;1h双方自我介绍为什么学前端怎么学前端的,学多长时间了跨域XSS,&nbsp;CSRFTLS握手过程HTTPS安全吗webassemblyts页面很卡怎么排查项目相关.&nbsp;..&nbsp;面试官:项目2后端数据怎么组织的?&nbsp;我:您是要问数据库的设计吗?面试官:哦,用了数据库是吧,说一下关系型非关系型用过哪些,使用场景分包怎么配置的?优化数值怎么来的?vite&nbsp;esbuild&nbsp;rollup项目技术栈那一行写的后端springboot,问:后端是用什么写的?node吗?用的js还是ts?ts。用的vue几?3,vue2&nbsp;3区别项目上线了吗?还是说只是练习的?项目跨域怎么配置的?其他的忘了代码题:版本号比较对象比较反问:业务:qq小游戏还有几面:2到3本来还想问一下表现怎么样,面试官主动byebye了几分钟后已过非科转码第一面一定会越来越好的——————————分割线——————————2.&nbsp;&nbsp;二面4.&nbsp;16&nbsp;37min自我介绍项目优化的值怎么算出来的分包怎么做的项目是实验室的还是实习的吗?个人的(减分?)大文件分片,双token,优化,cookie和jwt有个js动态添加的button,现在没了,怎么排查三个函数,a调c,b调c,c里面怎么知道是哪个调的它输入框,用户只能看不能输入,多种方法事件冒泡捕获口述快排闲聊:哪里人为什么从大老远来广东上学职业规划优点和缺点无手撕其余的忘了反问:业务实习生的要求什么时候出结果对非科的建议感觉kpi,要止步于此了吗50min后更新,过了可能还是面试官的风格不同,——————————分割线——————————3.&nbsp;三面4.17&nbsp;37min没开摄像头,时间也短,又要止步于此了吗介绍怎么学前端的,学了哪些选一个项目介绍,小组分工、怎么实现的、怎么解决问题的八股一个没问代码题:找出数组中出现两次的数,除了map。其时间复杂度O(n)和不用额外空间的方法思考题:路口30min内有车通过的概率是90%,5min内有车通过的概率是多少反问:业务:我们是一个互联网公司,做的也是互联网相关的业务。???建议:学个人技能提到的前端相关的技术。???上下班时间:无打卡,早10,晚6-9实习生相关:暑期、有导师带、转正HC还不知道6h后更新,已过还剩两面——————————分割线——————————4.&nbsp;四面4.&nbsp;23&nbsp;30min自我介绍虚拟DOMVue23的diff移动端和PC端需要注意的项目:登录怎么做的,密码传输文件上传和储存SDK怎么做的,怎么用,怎么上报,性能指标怎么算,分工规划反问:技术栈:Vue23、js,和原生应用交互建议:多去想为什么——————————分割线——————————5.&nbsp;HR面4.&nbsp;24&nbsp;20min介绍说本来想问我专业相关的,为什么换方向,既然我在介绍中说了,就不问了项目分工负责哪部分遇到哪些困难小组沟通有没有其他流程对实习的期望实习时间录评了,说五一之前给结果,许个愿——————————分割线——————————4.&nbsp;27&nbsp;已OC咏鹅有鹅选鹅,无鹅延毕,明年再鹅,延毕还无,建议读硕,毕业再鹅,无鹅延毕,明年再鹅,若再无鹅,建议读博,毕业再鹅,无鹅延毕,明年再鹅,延毕还无,博后可读,出站再鹅,若再无鹅,入校拼搏,评上教授,还能再鹅。
给个工作吧灬:五面啊😱
点赞 评论 收藏
分享
评论
点赞
12
分享

创作者周榜

更多
牛客网
牛客企业服务