MySQL和服务器端对接的时候,我们知道一般就是服务器端会打包一些SQL命令去增删改查数据库,这个打包的数据库SQL语句数据包一般为4MB,再大一些就不会被数据库端接收了
但是我们可以自己更改默认大小,当数据包到达数据库端以后,它们会经历那些操作然后返回结果给服务器端呢?
大概有:查询缓存,SQL解析,预处理器,SQL优化器,执行器,存储引擎,返回结果给服务器端
(相关资料图)
上面就是sql命令的整体执行流程,接下来我们对各个步骤进行拆分,细化的讲解一下他们都做了些什么操作
在服务器端和数据库端的连接方式中,我们采用的是半双工的方式,也就是说要么是一次申请到达数据库端,要么是一次结果响应到服务器端
不存在一个数据包还没全部到数据库端,它的结果已经开始响应到服务器的情况
另外,作为第三方连接,我们一般都是使用的数据库连接池,数据库端一般会提供很多的连接接口,供服务器端不同的用户去连接,使用完了然后释放
既然作为第三方连接,它就会使用到数据库驱动,就像JDBC,C3P0等等
此外,数据库一次接收服务器端发来的数据包大概有4MB,多了它就选择不接受了,当然我们也可以自己更改默认接收包的大小
在数据查询完了,返回结果给服务器端也是,它只能一次全部接收,不能只接受一部分结果响应
MySQL的缓存是一个很鸡肋的东西,它很少用,但是要想了解底层就必须知道它,它的存在很鸡肋,也导致使用它的很少
数据缓存指的是对已经查询过的数据放在缓存中,下次sql命令来了以后先查询缓存中有没有已经查过的,没有才会去执行新的一次查询,有则直接返回给服务器端
缓存的构成是Map集合,他有两个属性组成,key和value ,key用来存放sql语句,而value用来存放查询的结果
看起来使用缓存会提升查询的效率,但是真正到实战开发以后就会知道,它并没有那么好用,首先一般我们的查询语句都是不同的,很难连续两次的sql完全一样,最好的情况也是条件相差不大
但是也是达不到完全吻合key值的sql,所以实战开发使用效率十分低,伴随着的就是它的缺点,因为它是sql执行的第一个操作,每个sql进来的都要去找一遍,但是都是找不到的
白白的浪费了这么多的开销,而且每一次对数据库的增删改都会影响这个缓存,使其失效,维护又是很大的开销
所以在MySQL 5.7版本是默认关闭这个缓存的,他会跳过查询缓存这一步直接sql解析,到了MySQL8.0的时候直接把查询缓存删掉了,不再需要这个功能了
sql解析执行包括了:词法分析,语法分析,分析机,生成语法树
词法分析:从左到右一个字符、一个字符地输入,然后根据构词规则识别单词。将会生成Token词
广告
X 关闭
广告
X 关闭