“ 想搞懂Mysql,先从Mysql的基础架构开始吧。”
解析架构
—
写了那多的CURD,你是否对Mysql的执行过程有所好奇,就像面试经常被问起的一个问题:简单说从输入URL到页面加载完成的过程吧。哈哈,其实并不简单。Mysql也是如此,下面我们也简单了解一下sql的执行过程吧

图1
从图1我们可以初窥堂奥,连接器,分析器,优化器,执行器,存储引擎。每一个模块,都肩负着重任。sql执行的漫漫长路,就此展开。。。
连接器
—
你快开门啊
当客户端连接MySQL服务器时,首先经过的是连接器,它负责跟客户端建立连接、获取权限、维持和管理连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候就要验证用户名跟密码。
如果验证通过,连接器会一个权限表里面查出当前用户拥有的权限。此后这个连接的权限判断,都将依赖于此时读到的权限,所以当运维大佬修改了你的权限之后,知道要干什么吧
连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout控制的,默认值是8小时。
查询缓存
—
你还在不在啊
连接建立完成后,执行select语句时,会来到第二步:查询缓存。MySQL会先查询缓存,之前是否执行过相应的Sql语句,之前执行过的Sql语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。
key 是查询的语句,value 是查询的结果。如果能够查询到,对应的结果就会被直接返回给客户端。
不过对于更新压力大的数据库来说,这个功能就有点鸡肋了,因为查询缓存的命中率会非常低。对于一些静态表,如存储之前N年的城市人口信息表,这张表上的查询,才会适合。
分析器
—
你要干什么
很不幸,缓存抛弃了你
,所以你无奈选择了另辟蹊径。莫慌,你会发现康庄大道也是,真香



分析器
—
我来帮你吧
优化器会在表里面有多个索引的时,决定使用哪个索引;也会在Sql语句有多个join的时,决定各个表的连接顺序。。。优化器在默默的优化Sql的执行效率。
执行器
—
我们开始吧
通过分析器知道了要做什么,通过优化器知道了该怎么做,接下来就交给执行
器吧,开始执行语句。
开始执行的时候,会先判断一下用户对表校验权限,没有的话,会返回没有权限的错误。如:
ERROR 1142 (42000): SELECT command denied to user 'test'@'localhost' for table 'a'
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。如:
mysql> SELECT * FROM a WHERE name='test';
若name字段没有索引,那么执行器的执行流程是(以InnoDB为例):
1. 调用 InnoDB 引擎接口取这个表的第一行,判断name值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
对于有索引的表,执行的逻辑也差不多。
1.第一次调用的是“取满足条件的第一行”这个接口,
2.之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。
至此,这个语句就执行完成了。用户可以在数据库的慢查询日志中查询到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。
小结
—
这么快就结束了
这篇文件只是简单介绍一下MySQL的逻辑架构,希望你对一个SQL语句完整执行流程的各个阶段。
有了一个初步的印象。由于篇幅跟时间的的关系,我只是用一个查询的例子将各个环节过了一遍。
如果你还对每个环节的展开细节存有疑问,也不用担心,后续在文章中我还会跟详细的对其进行分析。
结束语
七分热度,三分坚持,十分成功!




