一条sql语句的执行过程

286 阅读6分钟

相信大家在了解mysql之前一定对sql语句的执行有着不小的疑惑!
我曾经天真的以为mysql的服务端仅仅是把数据加以判断写入表中就完事了
在学习过后才认识sql语句背后的逻辑严谨

那今天就一起学习一下一条mysql的执行过程吧

软件架构

  • client: 我们平时通过jdbc驱动连接或者使用图形化的工具本质上是传输sql语句(DLL、DML)的工具,与服务端的mysql服务器进行通信(mysql四种通信方式),在学习阶段我们mysql的安装地址一般是安装在本地,即客户端与服务端在同一台机器。所以它们之间的通信方式采用的是Unix Socket,直接在本地计算机进程之间通信(进程的两种通信方式
  • server:在服务端接收客户端sql语句之前,它们之前需要建立连接(长连接或短连接)——连接器。连接成功之后,client便可以与server进行通信了,而当server拿到一条sql语句的时候,它会先检查语句的语法和语义是否符合规范(包括数据库是否存在该表该字段)——解析器,sql符合规范会被优化得到执行计划,选择索引——优化器,执行引擎调用存储引擎提供的API执行语句——执行器。这些不同的组件对一条语句进行解释优化执行,在server层的下一层存储引擎是一个SPI可以由不同的厂商实现,我们也可以自定义实现。常用的4种存储引擎MyISAM、InnoDB、MEMORY、MERGE。

连接器

连接器主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作。 如果用户密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。 如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。

查询缓存( Query cache)

客户端与服务端建立连接后,MySQL 在执行查询语句时会先查询缓存,校验这条SQL是不是在之前执行过。之前执行过的语句及其结果会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个value 就会被直接返回给客户端。如果没有命中,则需要执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。 看到这里大家会不会眼前一亮,会不会有这个功能很好要好好利用的冲动。 其实这里并不建议使用查询缓存,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非是那种很长时间不会更新的表,比如系统配置表,但是这种系统配置我们放在配置平台不好吗? 在MYSQL8.0中已经删除了查询缓存这个功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。 分析器 Mysql没有命中查询缓存,那么就会进入分析器,分析器主要是用来分析SQL语句是来干嘛的。分析器主要分为以下两步:

词法分析 :一条SQL语句有多个字符串组成,首先要提取关键字,比如select,提出查询的表,提出字段名,提出查询条件等等。 语法分析:根据词法分析的结果,语法分析主要就是判断你输入的SQL语句是否正确,是否符合MYSQL语法,如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

词法分析程序将整个查询语句分解成各类标志,语法分析根据定义的系统语言将“各类标志”转为对MySQL有意义的组合。最后系统生成一个语法树(AST),语法树便是优化器依赖的数据结构。

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。 为什么需要优化器?

优化器中包含了许多复杂的优化技术,这些优化技术往往比最好的程序员掌握的还要多。系统的自动优化相当于使得所有人都拥有这些优化技术。

优化器可以从数据字典中获取许多统计信息,例如表中的行数、表中的每个列的分布情况等。优化器优化器可以考虑百种不同的执行计划,而程序员一般只能考虑有限的几种可能;

可以根据这些信息选择有效的执行计划,而用户程序则难以获得这些信息;

总之优化器是对语法分析树的形态进行修改,把语法分析树变为查询树,确定执行方案。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。 开始执行的时候,要先校验改用户是否有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就会去调用引擎的接口,返回接口执行的结果。 上述参考 作者:飘渺Jam 链接:juejin.cn/post/684490…

存储引擎

不同的存储引擎有着相同的方法入口,这使得server层的执行器的逻辑代码可以高度复用

下篇更新各种执行引擎的详细内容

本人新手博主,以上如有错误欢迎指正