成长之路 ------- 一条SQL语句的前世今生

这是我在阅读了一篇大佬的文章之后写的一些感悟,也是我来到csdn这么久来第一次写博客,希望不是那么的差劲,下面直接进入主题:
我这里给出SQL语句执行时需要经过哪些环节的图:
在这里插入图片描述从图中我们可以看出不同的存储引擎共用一个server层,执行步骤:
1. 连接器:
负责验证用户名与密码是否正确,是则拥有权限,否则报错;有时连接成功后我们会发现数据库内存消耗的非常快,这是因为进行的是长连接,操作数据库的数据会存储在管理对象的内存中,只有当连接断开才会清理内存,长连接就是连接成功后可以执行许多次操作,短连接则是有请求来时才执行,没有则断开连接。但当我们连接成功后不进行操作,使用 show properites 会发现进行sleep状态,但超过阈值默认8h则会断开连接,这时候在操作会报错;

2. 查询缓存:
当一条sql语句来执行时,会首先判断是否曾经进行这种操作,如果是则直接返回结果,没有则进行下一步操作。因为数据库是以 key - value 的形式来存储数据的那这样看来我们每次执行一次后都存储其查询语句,效率岂不是更高? 但我认为这种操作弊大于利,因为没更新一次数据库,会自动清理查询缓存,之前辛辛苦苦存储的数据都没用呢,就没有得不偿失啊。
3. 分析器:
当没有找到相应的查询缓存就会进行此操作,会分析 SQL语句的词法,语法。 如果符合mysql的语法规则那数据库也就知道你要干啥了。 简而言之这一步是告诉数据库你要干啥。
4. 优化器:
而这一步则是怎么干 ! 因为当执行一条内连接的语句时数据库会判断先执行A表在执行B表的效率高,还是相反。虽然两个方法执行的结果相同,但消耗的资源可就不是一个层次的;
5. 执行器:
前面知道了干啥,咋干,接下里就是执行了。首先数据库会先判断对于这个操作你有没有权限,如果有则进行相关操作,没有则报错。
6. 存储引擎:
存储引擎是提供相应方法的接口,调用数据,返回结果的左右. 不同的存储引擎相应的执行方法不一样,但好像现在都是 InoDb了 。
最后有没有哪个大佬知道 当执行 select * from A where T==x 时,假设A表中并没有相应的 T属性,问实在哪个环节报错 ???

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值