概述

本文将从一条简单的单表查询sql出发,探析mysql执行查询sql的底层实现逻辑。

mysql基本架构

mysql如何出逻辑图 mysql底层逻辑_存储引擎

上图就是Mysql的逻辑架构图。大体来说,MySQL可以分为Server层和存储引擎层两部分。

Server层 包括连接器、查询缓存、分析器、优化器、执行器等,涵盖mysql绝大多数的核心功能。

存储引擎层 负责数据的存储和提取。mysql支持InnoDB、MyISAM、Memory等多个存储引擎。从mySQL 5.5.5版本开始,InnoDB成为了mysql的默认存储引擎。

mysql查询语句执行流程

假设我们有一个最简单的表T,表里只有一个ID字段,执行如下查询语句:

mysql如何出逻辑图 mysql底层逻辑_mysql查询语句逻辑_02

当我们执行这条查询sql时,mysql会经过如下的执行流程,每个组件都发挥着自己的作用:

连接器

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

连接命令输入后,先完成经典的TCP握手,成功之后,就根据你输入的用户名和密码,认证你的身份。身份认证通过后,连接器会到权限表里面查出你拥有的权限。连接之后的所有权限判断逻辑,都依赖于此时读到的权限。

查询缓存

连接建立完成后,mysql会先通过缓存查询,查询之前是否执行过这条语句,如果命中,则直接返回缓存的结果。缓存是通过key-value的形式存在的。其中key是查询语句,value是查询结果。值得一提的是,由于查询缓存的失效非常频繁,维护缓存的代价非常大。从mysql8.0开始,已经彻底没有缓存的这个功能了。

分析器

当缓存没有命中时,就要开始执行语句了。这时候分析器先对sql语句进行词法分析,识别你输入的字符串表示什么意思。比如这里的”select * from T where ID=10;”,就会识别出select关键字,表名T,字段名ID等单词或字符。 当词法分析完,且没有报错时,将开始进行语法分析,判断所识别出来的单词或字符的组合是否符合mysql的语法规则。

优化器

通过分析器,mysql知道了你要执行什么操作。在执行前,还要经过优化器处理。 优化器的主要功能就是决定执行何种策略,优化查询效率。比如有多个索引时,决定使用哪个索引;多表联合查询时,决定先查询哪个表等等。

执行器

到这里,就说明mysql要真正开始执行查询语句了。这里分为两个阶段:

1、 通过从连接器获取的权限信息,判断当前用户对当前表有没有执行查询的权限,没有的话,则报错。

2、 根据表的引擎定义,使用引擎提供的接口。这里以默认的InnoDB为例:

1. 当表有索引时,“满足条件的行”是满足索引条件的行,没有索引时,“满足条件的行”是全表的行。

2. 从“满足条件的行”的第一行开始,判断ID值是10,则将这行存在结果集中,否则跳到从“满足条件的行”的下一行,重复相同的判断逻辑。

3. “满足条件的行”遍历完成后,执行器将结果集返回给客户端。