执行一条 SQL 语句,期间发生了什么?
学习 SQL 的时候,大家肯定第一个先学到的就是 select 查询语句了,比如下面这句查询语句:
// 在 product 表中,查询 id = 1 的记录
select * from product where id = 1;
但是有没有想过,执行一条 select 查询语句,在 MySQL 中期间发生了什么?
带着这个问题,我们可以很好的了解 MySQL 内部的架构。
所以,这次小林就带大家拆解一下 MySQL 内部的结构,看看内部里的每一个“零件”具体是负责做什么的。
MySQL 执行流程是怎样的?
先来一个上帝视角图,下面就是 MySQL 执行一条 SQL 查询语句的流程,也从图中可以看到 MySQL 内部架构里的各个功能模块。
查询语句执行流程
可以看到, MySQL 的架构共分为两层:Server 层和存储引擎层。
Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B 树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B 树索引。
好了,现在我们对 Server 层和存储引擎层有了一个简单认识,接下来,就详细说一条 SQL 查询语句的执行流程,依次看看每一个功能模块的作用。
第一步:连接器
如果你在 Linux 操作系统里要使用 MySQL,那你第一步肯定是要先连接 MySQL 服务,然后才能执行 SQL 语句,普遍我们都是使用下面这条命令进行连接:
# -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数;
# -u 指定用户名,管理员角色名为 root;
# -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码
mysql -h$ip -u$user -p
连接的过程需要先经过 TCP 三次握手,因为 MySQL 是基于 TCP 协议进行传输的,如果 MySQL 服务并没有启动,则会收到如下的报错:
如果