暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL系列--查询语句执行流程

看点有用的 2021-11-14
460


前言

MySQL作为当今最主流的数据库在各个公司被广泛使用,涉及到数据的基本操作都会和数据库进行交互。本文将主要介绍一条查询语句在数据库底层的执行流程。

一.MySQL架构简介


    MySQL的基本架构图如下图所示:

    从上图可以看出,MySQL主要分为Server 层和存储引擎层两部分,其中Server 层主要包括连接器、查询缓存、分析器、优化器、执行器等,他们涵盖了 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等;而存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持 InnoDBMyISAMMemory 等多个存储引擎。

二.各个组件功能介绍

    由上节可知,MySQL架构由多个组件构成,本节将主要介绍各个组件的功能。

01




#连接器#

  连接器主要负责跟客户端建立连接、获取权限、维持和管理连接。连接命令如下:

mysql -h$ip -P$port -u$user –p
复制

  输完命令之后,下一步需要在交互对话里面输入密码。PS:虽然密码也可以直接跟在 -p 后面写在命令行中,但这样可能会导致密码泄露,为了安全起见不建议直接输入密码。

  连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始身份认证,此时用的就是输入的用户名和密码。

  如果用户名或密码不对,会返回一个"Accessdenied for user"的错误,然后客户端程序结束执行;如果用户名密码认证通过,连接器会到权限表里面查出当前用户拥有的权限,之后这个连接里面的所有权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。连接完成后,如果没有后续的动作,这个连接就处于空闲状态,直到有下一步操作命令。

02




#查询缓存#

     查询缓存的作用是存储之前执行过的SQL语句。当MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。

  如果当前查询语句能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。因此如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

03




#分析器#

    分析器主要对SQL语句进行词法分析。如果一条SQL语句没有命中查询缓存,就要开始真正执行语句了。

  首先,MySQL需要对 SQL 语句做解析。分析器先会做词法分析SQL语句由多个字符串和空格组成,MySQL 需要识别出里面的字符串分别是什么以及代表什么。例如MySQL 从输入的"select"这个关键字识别出来,这是一个查询语句。

  做完了这些识别以后,接着就要做语法分析。根据词法分析的结果,语法分析器会根据语法规则,判断输入的这个 SQL 语句是否满足 MySQL 语法,如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

04




#优化器#

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

05




#执行器#

    执行器主要最终执行SQL语句。开始执行的时候,要先判断当前用户对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误;如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

三.一条查询语句的执行流程

    经过上述介绍已经对MySQL的底层架构有了认识,接着将介绍一条SQL查询语句的具体执行流程:

    例如语句:select * from table whereID=10;默认引擎为InnoDB;执行流程图如下图所示:

a.     执行SQL语句时首先会到连接器进行鉴权,只有当前用户名和密码鉴权通过才会继续向下执行;

b.    接着会进行查询缓存,如果该SQL语句已经保存到缓存则直接从缓存中获取结果返回;如果在缓存中没有获取到结果则继续向下执行;

c.     当缓存没有获取到结果时SQL语句就会向下执行来到分析器,分析器对SQL语句进行词法和语法分析,通过分析select可以知道该语句是查询语句,要查询的表为table表,字段为ID;如果该SQL语句没有语法错误则继续向下执行;

d.    经过分析器之后MySQL就知道该SQL语句要干什么工作了,接着需要优化器再进行优化,包括优化索引使用顺序和各个表的连接顺序等;

e.     MySQL 通过分析器知道了SQL语句要做什么,通过优化器知道了该怎么做,接着就进入了执行器阶段,开始执行语句;

f.      如果当前用户对table表有select权限则打开table表,然后根据table表定义的InnoDB引擎调用引擎接口取table表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;接着调用引擎接口取下一行,重复相同的判断逻辑,直到取到table表的最后一行。最终执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

    以上过程就是一条查询语句的执行流程。

小结

    本文主要简单阐述了一条查询SQL语句的执行过程,从MySQL架构入手,简述了MySQL各个组件的功能和作用,同时结合实际的SQL语句介绍了一条查询语句在MySQL执行的全部流程。


文章转载自看点有用的,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论