mysql┃送命题!!一条查询语句是怎么执行的???
本文约: 2428字
预计阅读时间:7分钟
一条查询语句是怎么执行的???
mysql中有哪些功能和模块??
select name from girlfriends where age = '18';
连接器
mysql -h$ip -P$port -u$user -p
●如果用户名或密码不对
你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
●如果用户名密码认证通过
连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
数据库里面:
长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
查询缓存
在连接建立完成之后,就开始执行我们的select语句了。
这个时候mysql就会去查询缓存中查询,看看我们刚才有没有执行过这条语句:
●如果有的话,就直接将缓存的结果返回给客户端。
●如果没有,就会进入下一步。
当进入后续步骤查询出来结果后,会再次将查询出来的结果放入查询缓存当中。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。
分析器
如果没有命中缓存,接下来就会走到分析器这一步了。
mysql会根据自己定好的规则针对你的这条语法进行分析,比如select代表查询,where代表条件等等。
到了这一步:
●如果你的sql出现了问题,那么mysql就会抛出一个错误:
You have an error in your SQL syntax; check the 。。。。。。。
优化器
到了这一步的时候,mysql已经知道你要做什么了,但是在最终执行你的命令之前,mysql还要进行一遍优化,比如索引的选择。
select name from girlfriends g left join boyfirends b
on g.id = b.id
where a.age = '18'
and
b.age = '19';
在上述语句中mysql就会去判断,是先从a.age这个索引进入还是b.age这个索引进入,哪种效率高呢?这就是优化器的工作。
在优化完成之后,mysql已经确定好了最终的执行方式。
优化器
于是就到了我们的执行器阶段,到底应该怎么执行。
首先,会调取用户的权限:
●如果没有权限,则会反回错误
●如果用户拥有权限,则会打开表继续执行
select name from girlfriends where age = '18';
今天moon和大家介绍了一下mysql 的基本架构,也聊了一下mysql一条查询语句的基本流程,让大家对mysql有了基本的了解,其中各个模块之间是怎样配合工作的,当然这只是一些基础。
那么下一篇我们就来聊聊
一条更新语句又是怎么执行的?日志系统又是如何在其中运用的?
我们下期见~~
END
关注moon
我们一起吊打面试官!
回复666 免费获得一线大厂面试资料!