Mysql逻辑架构图
借用很经典的一幅图,先来个全局的了解,SQL执行到底有哪些步骤。
Mysql逻辑架构分为两层
- 第一层Server层
- 第二层存储引擎层
Server层
连接器
是指通常我们所看见的在创建一个表的时候需要连接数库,所以在连接数据库时候就需要用到连接器,保证客户端能连接到数据库。连接器就负责跟客户端建立连接获取权限,维持和管理连接。
在连接完成后,如果没有其他的操作便处于空闲状态,默认8小时自动断开连接,当下次进行操作的时候需要重新连接数据库。
但是在连接之前咱们还有一个必不可少的环节,那就是需要通过TCP的三次握手连接MySQL服务。具体三次握手的过程是什么样的,详情见:TCP三次握手四次挥手
如下连接MySQL
连接命令:
mysql -h$ip -P$port -u$user -p
连接命令中的mysql是客户端工具,用来跟服务端建立连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。
- 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
- 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限
查询缓存
当连接器连接成功之后,所执行的SQL从缓存查询结果,如果有结果直接返回,没结果就继续往下走,走分析器,在查询的时候在SQL语句中写上关键字SQL_CACHE,表示要查缓存。在MySQL8.0之后就取消了查询缓存这一过程,取消了缓存。
分析器
假如对下列SQL进行分析
如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。分析器分析分为两个阶段,分别是词法分析和语法分析
- 词法分析
分析器先会做词法分析:你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么,识别哪些是关键字,哪些不是关键字。
- 语法分析
将SQL语句解析成一颗语法树
MySQL从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“student”识别成“表名T”,“username”识别为要查询的结果。
如果要查询的字段在数据表中不存在,在词法分析中就会出错,比如:
说明这个字段在表中不存在,在词法分析阶段就会被查出来。
优化器
将根据执行的SQL,决定执行那部分,比如说有联表查询,通过join连接,则优化器就会判断先连接那个表,表里有多个索引的时候决定用那个索引,最终生成一个执行计划进行执行。
执行器
MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句,返回查询结果。