一个每天写查询SQL的程序员不知道一条SQL是怎么执行的?项目经理:你走吧....

发布于 2021-09-06 08:10

我们有非常多的人每次通过dao层去访问数据库拿到数据却不知这条SQL是怎么查询到数据怎么返回的数据,更不知SQL执行过程,知其然不知所以然,看完这篇文章你将了解查询SQL的查询过程 

平时我们使用数据库,看到的通常都是一个整体。比 如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:

select * from user where id = 1

我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部发生了啥?

MySQL功能模块示意图:

其实我们经常用的MySQL分为服务端以及客户端:

而我们操作数据以及存储数据就是在服务端发生的。

我们今天也就讲一讲我们这个server

MySQL server下包括了连接器查询缓存分析器优化器执行器等等,这基本是MySQL核心的服务功能了,以外的还有一些内置函数(比如:日期函数、时间函数、Math函数)、跨存储引擎的一些功能(比如:存储过程,触发器、视图等)

PS:关于存储引擎,在MySQL5.5以后 默认就是使用innodb,这个应该大部分朋友都知道吧,这是个比较常用也比较强大的一个存储引擎。不过也并不代表其他存储引擎不好,技术没有好坏,根据场景我们可以使用不同的存储引擎

下面就介绍一下这一个个的功能模块分别是怎么触发以及怎么处理的。

连接器:

主要负责客户端和服务端之间的连接,以及权限管理等等。

mysql -u root -p ${pwd}

我们应该对这句命令都不陌生吧?

没错,这就是建立连接的语句,等我们输入完这句命令回车之后如果密码没问题的话我们就会成功建立连接,当然密码出问题了除外。 /滑稽

这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改, 也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置

连接成功后,如果你没有其他操作而是挂在那,一直处于一个空闲状态,客户端会有一个空闲时间的限制,默认是8小时

这里我们可以看到我们当前的空闲时间。

如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后 再执行请求了。

这里可能有些朋友有话说了,我用工具navicat连接为啥我过几天都还在呢?

这个问题可以说是太好了,哈哈哈哈,据我所知navicat会有重试机制,相当于过一段时间就会刷新这个睡眠时间,实在喜欢钻牛角尖的朋友可以一起探讨一下哈。

查询缓存(MySQL8 已弃用):

关于这个缓存,为什么MySQL8会弃用呢,因为我们的这个MySQL的缓存是以查询到的SQL来做为这个缓存的key,查询结果作为value,当我们查询的sql在缓存能找到的情况下,就会应用这查询结果。但是只要我们对这个表进行增删改操作之后缓存就会清空,这样其实对我们的MySQL性能损耗非常之大,也没必要。

这个东西了解一下就行哦。

因为现在我们开发都会用到一个持久层,一般的持久层都会有一级缓存以及二级缓存,我们可以用那个。

分析器(语法分析器):

知道你要做啥

当我们的缓存没有查询到我们的SQL分析器就会去解析(分析),词法分析这条SQL,其实我们输入一条sql程序也不知道我们输入的是什么,就像我们写一个Java程序,jvm也不知道你写的是嘛玩意,而是使用java虚拟机中的java解释器(java.exe)来解释,执行其字节码文件(.class文件),类似的场景。

MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符 串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”

如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比 如下面这个语句 select 少打了开头的字母“s”。

elect * from t where ID=1;

优化器:

知道了该怎么做

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器 阶段,开始执行语句

首先开始执行之前,会先判断你对这个表有没有查询的权限,如果没有就会提示你权限错误。如果有权限:就分为两种情况了

  • 查询的字段没有索引

       如果没有索引,就调用 InnoDB 引擎接口取这个表的第一行,判断 id 值是不是 ,如果不是则跳过,如 果是则将这行存在结果集中        

      调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行

      执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

        到这里我们流程就走完了。

  • 查询的字段有索引

    关于这个有索引的设计到索引的实现原理,这个我们就放到我们后续文章再来深入讲解,本篇就主要讲一下查询sql的执行流程,敬请期待哈...

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材