一条sql的执行之路

查询sql的执行过程

第一步:验证连接数据库的账号密码

  • 当客户端连接 MySQL 时,会发出连接请求到连接器,连接器此时就会去验证这个连接的账号密码
  • 如果账号或者密码不正确,客户端就会收到一个 Access denied for user 的错误,之后此次连接结束
  • 账号密码正确,连接器会到权限表里面查询出该账号所拥有的权限,之后这个连接里面的权限判断,都是以此时读到的权限为根据

  • 所以当我们去修改数据库权限后,需要断开连接后重连
  • 当连接后没有进行操作后,会处于空闲状态,可通过wait_timeout 进行断开控制,默认8小时空闲断开,连接断开后,需进行重连,方可进行操作

第二步:数据库的两种连接--连接器

  • 短连接:每次执行完很少的几次查询就断开连接,下次想查询时,就要重新建立一个
  • 长连接:如果客户端持续有请求,那就一直使用同一个连接 
  • 建立连接是比较麻烦的,首先要发送请求吧,发送了请求要去验证账号密码吧,验证完了要去看你所拥有的权限吧,所以在使用过程中,尽量使用长连接
  • 但是使用长连接又有新的问题:有时候,你会发现 MySQL 占用内存,因为是长连接嘛,所以它会在断开的时候才将资源释放掉。解决方案:定期断开长连接,如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作之后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重新连接和权限验证

第三步:查询缓存

  • 首先看缓存里面有没有,如果有呢,那就没有必要向下走,直接返回给客户端结果就可以了
  • 如果缓存中没有的话,那就去分析器
  • 因为查询缓存的失效非常频繁,只要有对一个表的更新,那在这个表上的所有查询缓存都会被清空。所以就会导致 MySQL 缓存给建立起来,结果呢还没怎么用,一个更新操作,给弄没了,所以 MySQL 8.0 版本直接将查询缓存的整块功能都给删掉了

第四步:分析器

  • 词法分析:分析器首先会进行"词法分析",词法分析就是 select * from T where id=1; ,它会将 select 识别出来,哦,这是一个查询语句,接下来会将 T 也识别出来,哦,你是想要在这个表中做查询,然后将 where 后面的条件也识别出来,原来我需要去查找这些内容
  • 语法分析:语法分析主要就是分析输入的 SQL 语句合不合法

第五步:优化器

  • 对sql语句进行优化,比如查询表里有多个索引,会分析哪个索引效率高,多表联查,会分析关联哪几个表效率高

第六步:执行器

  • 执行语句,首先查询权限,是否具备查询权限
  • 从表中的第一行进行where条件判断,如果不是就跳过,如果是就放入结果集
  • 接着取表中的下一行数据,重复相同的判断逻辑,直到表的最后一行
  • 执行器将上述满足条件的行放入结果集返回客户端
  • 查询结束

第七步:存储引擎

  • 负责对数据的存储和提取
  • 存储引擎,最熟悉的是InnoDB,从mysql5.5.5版本开始,就为默认的存储引擎

第八步:实战例子

select * from T where `name` = '阿粉' and age = '18' ;
  1. 通过连接器查询当前执行者的角色是否有权限,进行查询,如果有,则继续,如果没有,则会被拒绝
  2. 分析器分析语句,语句没有问题,则继续向下执行
  3. 接下来为优化器,sql为两种执行方案:a.先查询表中姓名为阿粉的,然后再判断他年龄是不是18岁                                        b.先查询表中年龄为18岁的所有人,然后再从里面找到姓名为阿粉的
  4. 优化器选择好方案之后,由执行器进行执行     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值