一条sql执行的过程(1)

这篇来讲一下,关于数据库所的问题,这里就是一句简单的sql查询语句为例,看看它在mysql中究竟是怎么执行的,在分析层面上,我就分为两个层面了,一个是总体的层面,就是这条sql语句的执行过程,另一个层面就是sql实际执行的细节方面,我们现在看看大体上的执行过程吧。

首先我们先来连接一下sql的执行流程:

图来自于网络:

在这里插入图片描述

其中sql的执行要经过已下几个步骤,我们来分别说一下:

在这里插入图片描述

连接器
首先需要得到创建和客户端的连接,通过输入用户名密码来获取当前用户使用数据库的权限,项目中一般使用的是Druid连接池,因为数据库的连接始终很昂贵的资源,连接的创建和销毁也是一中很耗时的操作,所以一般使用的是长连接的方式,一段建立的连接,就在当前的连接下进行一系列的数据库操作,同时如果客户端在一段时间没有动静,数据库会主动的将连接断开,这个客户端没有动静的时间可以通过timeout参数进行配置,同时长连接的情况下,对于一些sql在执行过程的内存是管理在连接对象中的,只有等连接断开了,内存才会得到释放,所以可能会发生mysql占用内存大的情况,这里的方法是要定时的断开一些占用比较大的长连接操作,或者5.7版本可以通过mysql_reset_connection来初始化连接资源,这个时候不用重连和做权限验证,只是回来了新建连接时的状态,清理了的内存。

查询缓存

mysql接受到一个查询请求的时候,会先去缓存中查找有没有相同的数据,如果存在的话,就把结果直接返回到客户端,如果没有就继续后面的查询操作,那么在存的是什么的的数据呢?其实就是一个hashmap,key—value键值对,key存的是对应的sql版本信息和sql语句等,对应的value存的是查询的结果数据。

但是这个缓存Mysql官方团队在8.0版本之后就把缓存模块直接删除了,在5.7之后缓存默认也是不开启呢,为什么呢?因为缓存数据在sql更新语句时会将已有的缓存数据全部删除,对于数据库这种更新操作频繁的操作,维护数据的缓存其实也会造成一定的压力,这种缓存只有对于那种系统配置表是比较友好的,因为配置表基本不会变化,缓存的数据也不会频繁需要维护。
经历过缓存就会到分析器部分了

分析器
分析器部分主要会对接收到的sql语句进行"词法分析"和"语法分析",词法分析会把你sql语句进行分割,识别出来里面的各个单词,看看sql有哪些单词组成的。语法分析就是用来判断当前的sql语句是否符合sql的语法。
后面就会进入到分析器中的预处理阶段,这个阶段就会判断sql语句中查询的列和表是否是存在的,如果不存在,就会抛出错误返回,同时还会进行权限验证,判断当前用户是否有权限进行此次的sql操作。
经历过分析器的重重判断,说明sql语句是可以执行的,就会进入到优化器

优化器
优化器的作用就是优化sql语句来使sql语句执行的效率最高,这里可能就会改变原始sql语句的语法,比如连表的顺序,使用字段的索引等等
确定好优化方案之后,就会交给执行器进行执行

执行器
执行器在这里就会真正的去调用存储引擎的接口去查询实际的数据,然后将查询的结果返回给客户端。

上述把一条sql语句在mysql中执行的过程大致介绍了一遍,但是sql具体是怎么执行的呢,比如sql是怎么查询到对应数据的,多个sql并发执行怎么加锁的,这些问题我们在后面一篇继续深入探索。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值