mysql sql查询语句执行流程

一条sql语句执行时,在mysql内部的流程是怎样的呢?
这里对mysql内部拆解一下,这样当碰到mysql的一些异常或者问题时,能快速定位解决问题

  • 先看下mysql的逻辑架构图
    mysql sql查询语句执行流程_第1张图片

大体来说,mysql可以分为Server层跟存储引擎层两部分

  • Server层包括连接器,查询缓存,分析器,优化器,执行器等,涵盖mysql的大多数核心服务功能,以及所有的内置函数(如日期,时间,数学和加密函数等,)所有的跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等。还有一个通用的日志模块 binglog日志模块。
  • 存储引擎层负责数据的存储和提取。期架构模式是插件式的,支持InnoDB,MyISAM,Memory多个存储引擎。现在最常用的存储引擎是InnoDB,他从Mysql5.5.5版本开始成为了默认存储引擎,InnoDB引擎有自有的日志模块redolog 模块。
  1. 连接器

主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。

  1. 查询缓存

mysql拿到一个查询请求后,回先到缓存看看,之前是不是执行过这条语句,之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端

不建议使用缓存!

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存就会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存命中的效率会非常低。
对于不经常更新的数据来说,使用缓存还是可以的,Mysql 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。

  1. 分析器

mysql 没有命中缓存,那么就会进入分析器,分析器主要是用来分析SQL语句是来干嘛的,分析器也会分为几步:

  1. 词法分析,一条SQL语句有多个字符串组成,首先要提取关键字,比如select,提出查询的表,提出字段名,提出查询条件等等。做完这些操作后,就会进入第二步。

  1. 语法分析,主要就是判断你输入的sql是否正确,是否符合mysql的语法。

完成这2步之后,mysql就准备开始执行了,但是如何执行,怎么执行是最好的结果呢?这个时候就需要优化器上场了。

  1. 优化器

优化器的作用就是它认为的最优的执行方案去执行(虽然有时候也不是最优),比如多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。

  1. 执行器

当选择了执行方案后,mysql就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。

你可能感兴趣的:(mysql,mysql,sql,数据库)