mysql得执行原理

一条查询语句的具体执行过程
当一个用户从客户端输入姓名密码时,是怎样执行的:
在这里插入图片描述
在这里插入图片描述
连接器:
当客户端连接 MySQL 时,会发出连接请求到连接器,连接器此时就会去验证这个连接的账号密码。
mysql 的连接器是msyql server层的第一个模块。当我们用mysql 客户端来连接mysql服务器的时候,处理这个连接请求的就是连接器模块
mysql客户端和服务器端的连接使用的是TCP协议
在完成经典的 TCP 握手后,连接器就要开始认证身份
密码错误:收到"Access denied for user"的错误,然后客户端程序结束执行。
密码正确:读取用户权限。后续所有的权限判断逻辑,都是基于此时获取到的权限进行的
这就是为什么更改了一个账号的权限之后,一定要断开再重连才有效吧
在数据库中有两种连接:
短连接:每次执行完很少的几次查询就断开连接,下次想查询时,就要重新建立一
长连接:如果客户端持续有请求,那就一直使用同一个连接
其中短链接比较麻烦,请求,验证密码账号,调取权限等一系列操作。而长连接是比较方便的,但是会比较占用内存,因为他在它会在断开的时候才将资源释放掉。
这个时候可以考虑下面两种方案:
定期断开长连接
如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作之后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重新连接和权限验证。
分析器:
连接完成后,在 MySQL 8.0 之前是需要查询缓存的,如果有呢,那就没有必要向下走,直接返回给客户端结果就可以了。如果缓存中没有的话,那就去分析器。
因为查询缓存的失效非常频繁,只要有对一个表的更新,那在这个表上的所有查询缓存都会被清空。所以 MySQL 8.0 版本直接将查询缓存的整块功能都给删掉了。
分析器首先会进行"词法分析",词法分析就是 select * from T where id=1;
将 T 识别出来,将 where 后面的条件也识别出来,再将select识别出来,
这样分析器就知道原来我需要去查找这些内容。
然后是:语法分析:主要就是分析输入的 SQL 语句合不合法。你的 SQL 语句不符合规则,就会收到 You hava an error in your SQL syntax 的错误提示
优化器:
经过分析器分析之后, MySQL 就知道你要的是什么了,但是就像条条大路通罗马一样,看似是一条简单的 SQL 查询语句,有可能有好多条执行路径可以走,比如说
在这里插入图片描述
优化器就想,这条执行语句,有两种执行方案啊:
先查询表 T 中姓名为 阿粉 的,然后再判断他年龄是不是 18 岁
先查询表 T 中年龄为 18 岁的所有人,然后再从里面找到姓名为 阿粉 的
这就需要优化器来选择用哪种方案了。
执行器:
优化器做完优化之后,就到了执行器
执行器就是要去执行语句了嘛,那我肯定要看看对于要查询的表 T 有没有查询权限,如果没有直接就拒绝,这没啥说的 如果有的话,那就会这样(在这里以 InnoDB 为例):
1:调用 InnoDB 引擎接口取这个表的第一行,判断 ID 的值是不是 10 ,如果不是就跳过,如果是那就放在结果集中;
2:调用引擎接口取“下一行”;重复相同的判断逻辑,直到这个表的最后一行
3:执行器将上述遍历过程中所有满足条件的行,组成记录集返回给客户端
存储引擎:
它负责的是对数据的存储和提取;关于存储引擎这块,最熟悉的应该就是 InnoDB 了。因为innodb的运行原理涉及到后台线程,内存池,以及不知道的技术,所以有兴趣的可以去看一下。
https://www.jianshu.com/p/519fd7747137
举个栗子总结一下:
在这里插入图片描述
就用这句话为例子:
1:客户端输入姓名和年龄,提交请求,mysql通过连接器查询当前执行者的角色是否有权限,进行查询。如果有的话,就继续往下走,如果没有的话,就甩你一个 Access denied(拒绝,否定)for user 的错误信息。
2:接下来就是分析器来分析语句了,词法分析,然后语法分析,没啥问题,继续往下走。
3:优化器:
1:先查询表 T 中姓名为 阿粉 的,然后再判断他年龄是不是 18 岁
2:或者先查询表 T 中年龄为 18 岁的所有人,然后再从里面找到姓名为 阿粉 的
等优化器决定选择哪个方案之后,执行器就去执行了。
4:执行器:
调用 InnoDB 引擎接口,执行查询,然后返回给客户端结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值