吊打面试官之 MySQL 中一条 SQL 语句的执行过程
前言
在平常的开发中,可能很多人都是 CRUD,对 SQL 语句的语法很熟练,但是说起一条 SQL 语句在 MySQL 中是怎么执行的却浑然不知,今天我就由浅入深,带大家一点点剖析一条 SQL 语句在 MySQL 中是怎么执行的,吊打面试官。本文主要从两个方面,查询语句和更新语句来解析。
一条 SQL 查询语句如何执行的
比如你执行下面这个 SQL 语句时,我们看到的只是输入一条语句,返回一个结果,却不知道 MySQL 内部的执行过程:
mysql> select * from T where ID=10;
在剖析这个语句怎么执行之前,我们先看一下 MySQL 的基本架构示意图,能更清楚的看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。
整体来说,MySQL 可以分为 Server 层和存储引擎两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎负责数据的存储和提取,其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。MySQL 5.5.5 之后默认是使用 InnoDB,如果不指定就会使用该存存储引擎,也可以在创建表的时候指定存储引擎或修改存储引擎。
从架构图中可以看出,不同的存储引擎共用一个 Server 层。
连接器
如果要操作 MySQL 数据库,我们必须使用 MySQL 客户端来连接 MySQL 服务器,这时候就是服务器中的连接器来负责根客户端建立连接、获取权限、维持和管理连接,一般的命令如下:
mysql -h$ip -P$port -u$username -p[$password]
在和服务端完成 TCP 连接后,连接器就要认证身份,用到用户名和密码
- 如果用户名和密码不对,就会返回错误并结束客户端程序
- 如果用户名和密码通过,连接器就会到权限表里面查出你拥有的权限,之后连接里面的权限判断逻辑都依赖于此时读到的权限
这说明一个用户成功建立连接后,即使对这个用户的权限做了修改,也不会影响现有的连接的权限,修改完之后只有再新建的连接才会使用新的权限设置。
连接建立之后,没有执行任何语句,这个连接就会处于空闲状态,如果客户端太长时间没动静,连接器就会自动将他断开