一条SQL语句在Mysql中是怎么执行的

一条Mysql语句是怎么执行的,可能很多人只了解其大概,今天就带大家深入学习一下Mysql是如何执行的。包括Mysql的查询语句与更新语句。
首先带大家看看Mysql的基础架构。
如下图所示:

在这里插入图片描述

Mysql主要分为Server层和存储引擎层。
•Server层包括连接器、查询缓存、分析器、优化器、执行器;
•存储引擎层主要负责数据的存入和读取。

一、Server层基本组件:

  • 连接器
    连接器主要负责登录者身份与权限的校验,当登录者身份和密码全部正确时,连接器就会查询权限表,查看该用户的所有权限,此时之后的所有操作都依赖于此次连接,也就是说,如果连接不断开,即使修改权限,用户对Mysql的使用也不受影响。
  • 查询缓存
    查询缓存用来存储一些查询语句以及查询语句的结果集(MYSQl 8.0后不再使用)
  • 分析器
    Mysql如果没有命中缓存,就会进入分析器,分析器的作用是分析sql语句,说白了,就是分析sql语句是干什么用的。分析器对Mysql的分析包括两部分
    1.词法分析:词法分析主要用来提取关键字,提取select/delete/updata/insert ,提取表名,提取value
    2.语法分析:语法分析用来分析sql语句是否正确
    完成这两步之后就可以执行了,那么怎么执行呢?这个时候就需要优化器登场了
  • 优化器
    优化器会选择一种最优的方式执行,(优化器认为最优,不一定是最优)
    Eg.select * from tb_student where age=‘18’ and name=’ 张三 ';
    有两种执行方式
    a.找到所有年龄是18的学生,再找到叫张三的
    b.找到所有叫张三的学生,再找到年龄是18的
    经过优化器之后,这条sql语句的具体执行步骤已经确定了,接下来需要执行器进行执行
  • 执行器
    Sql语句在执行之前会进行权限校验,如果没有权限会返回错误信息,否则会调用存储引擎层的接口,打印sql语句的执行结果

二、语句分析

1.查询语句
select * from tb_student where age=‘18’ and name=’ 张三 ';
Step1:身份权限校验,进行身份验证,账号密码通过,查询权限
Step2:查询缓存
Step3:[分析器] 如果没有缓存,进行词法分析(提取关键字、表名等信息),语法分析(分析sql语句语法是否正确)
Step4:[优化器],优化器选择一种最优的方式执行
Step5:[执行器] 执行器检验权限,执行语句

2.更新语句
更新语句相对与查询语句来说,要复杂一些
这里要讲到引擎的概念,MySQL 自带的日志模块是 binlog(归档日志) ,所有的存储引擎都可以使用,我们常用的 InnoDB 引擎还自带了一个日志模块 redo log(重做日志),最开始Mysql并没有InnoDB引擎,Mysql自带的引擎是MyISAM,但是我们知道redo log 是InnoDB引擎特有的,redo log 有crash-safe的能力(crash-safe是数据库发送异常重启时,之前提交的记录不会丢失)。而bin log只是归档。
eg.
update student set age=‘19’ where name=’ 张三 ';
Step1:身份权限,进行身份验证,账号密码通过,查询权限
Step2:查询缓存,把age的值改成19,调用引擎API,把新数据写入内存中,同时记录redo log,此时redo log进入prepare状态,然后告诉执行器,执行完成,随时准备提交,执行器收到通知后记录binlog(归档日志) ,然后调用引擎接口,提交redo log为提交状态。
Step3:更新完成

三、总结

查询语句
身份校验—》查询缓存—》分析器(词法分析,语法分析)—》优化器—》执行器校验权限—》执行器—》调用存储引擎的API接口,返回结果集

更新语句
身份校验—》存储缓存—》分析器—》优化器—》更新内容写入内存—》记录redo log—》prepare状态—》执行器执行—》记录bin logo—》redo log commit状态

猜你喜欢

转载自blog.csdn.net/qq_45791799/article/details/108760864