极客--基础架构:一条SQL查询语句如何执行?
执行一条查询语句,看整体流程
select * from T where ID = 10

大体上,Mysql分为Server层和存储引擎层两部分。
-
Server层包括连接器、查询缓存、分析器、优化器、执行器。涵盖Mysql的大多数核心服务功能,以及所有的内置函数(日期、时间、数学和加密函数等)
-
所以跟存储引擎的功能都在这一层,比如存储过程、触发器、视图。
-
存储引擎层负责数据存储和提取。其架构模式是插件式,支持InnoDB,MySAM,Memory等多个存储引擎。现在最常用的就是InnoDB
-
不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。
连接器
第一步,你会连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接
-
在完成经典的TCP握手后,连接器开始校验身份,这个时候输入用户名和密码
-
用户名和密码认证通过以后,连接器回到权限表查出拥有的权限,之后这个连接里面判断权限逻辑,都将依赖于此时读到的权限
-
一个用户建立连接以后,即使用管理员账号对这个权限做了修改,也不会影响权限判断逻辑,都将依赖于此时读到的权限
分析器
-
如果没有命中查询缓存,就要开始执行语句,Mysql需要知道做什么,因此有SQL语句解析
-
分析器做词法分析,你输入多个字符串和空格组成的一条SQL语句,MYSQL需要识别出里面的字符串分别是什么,代表什么?
-
一般语法错误会在这个阶段分析出来
优化器
经过了分析器,Mysql就知道做什么了,开始执行之前,还要经过优化器处理。
优化器在表里多个索引的时候,决定使用哪个索引,或者在一个语句多表关联的时候,决定各个表的连接顺序
执行器
-
开始执行的时候,会判断你对这个表有没有执行权限,如果没有就返回权限错误(在工程中实现,如果命中查询缓存,会在缓存返回结果的时候,做权限校验,查询也会在优化器之前调用precheck验证权限)
-
连接器是对于账号权限校验、分析器是对库权限的校验,执行器是对语句中表的权限校验(触发器)
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)。
引擎
-
打开表,执行器就会根据表的引擎定义,去使用引擎这个接口
-
执行器流程如下:
1.执行器会根据表的引擎定义,去使用引擎提供的接口
2.调用Innodb引擎接口取这个表的第一行,判断ID是不是10,如果不是则跳过,如果是则返回结果集
3.执行器将上述遍历过程中满足条件的行组成记录集作为结果集返回给客户端 -
你会在数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。
-
在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的

浙公网安备 33010602011771号