SQL语句的执行流程是什么?

基础架构

在这里插入图片描述

连接器

负责与客户端的建立连接、获取权限、维持和管理连接。用户建立连接之后,即使被管理员更改了权限,也不会影响已经存在连接的权限。必须使用新的连接才会生效。
客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout控制的,默认值是8小时。

长连接与短连接

  • 长连接: 连接成功后,如果客户端有持续的请求则一直使用同一个连接。
  • 短连接:执行完几次数据库操作就断开连接,下次执行操作重新建立连接。

长连接的问题

使用长连接可能会导致内存占用过多,会被内存强行杀掉,从现象看就是MySQL异常重启了
解决方案

  • 定期断开连接。
  • 执行mysql_reset_connection重新初始化连接资源。(这个过程不需要重新做权限验证,但是连接会恢复到刚刚创建完的状态)

查询缓存

MySQL拿到查询请求之后,会先去查询缓存中查看。
查询缓存以key-value的形式存储,key是查询的语句,value是查询的结果。
如果查询命中缓存,就可以直接返回结果,这个效率很高。
没有命中缓存,就会往后执行。大多数情况下,不建议使用查询缓存,因为缓存的命中率很低,因为只要有对一个表进行更新,那么这个表上的所有查询缓存都会被清空。除非你的业务是一张静态表,只做查询不做更改,或者很长时间才更改一次,这样就比较适合。

  • 设置不使用查询缓存:将query_cache_type设置成DEMAND。
  • 显示指定使用查询缓存
 select SQL_CACHE * from T where ID=10

分析器

对SQL语句进行词法、语法分析。

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引。
或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误。(在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用precheck 验证权限)。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值