1 - 基础架构 - 当你输入一条查询语句,在 MySQL 中发生了什么

关键字

基础架构,宏观理解

基础架构

要学习 MySQL ,首先你要在宏观上了解它的架构。这样,当你在执行一条命令的时候,会有一种“造物主视角”,同时,这种视角也会给你更加深刻的洞察力。在这里,我们就看一看,在你输入一条查询语句的时候,MySQL 中都发生了什么。

0.基础架构图:

专栏的作者给出了 MySQL 的基本架构示意图:


逻辑架构图

大体上,MySQL 分为 Sever层 和存储引擎层两个部分:

  • Sever层:包括连接器、查询缓存、分析器等。它涵盖了 MySQL 的大多数核心服务功能,以及所有的内置函数。所有的跨存储引擎的功能都在这一层实现,如:触发器、视图等。
  • 存储引擎层:负责数据的存储和提取。其架构模式是插件式的,支持多种存储引擎。现在一般默认使用 InnoDB引擎,除此之外,还有 Memory 等引擎。
    不同引擎存取数据的方式不同,支持的功能也不同。你可以在 create table 语句中使用 engine = xxx 指定引擎。

1.连接器

  • 连接器负责跟客户端建立连接、获取权限、维持和管理连接。
mysql -h$ip -P$port -u$user -p 
  • 首先,mysql 和服务器进行 TCP连接,握手之后,会对你对身份进行验证。认证需要用户名和密码。
  • 如果认证通过,连接器会到权限表中查找你拥有的权限。之后你的所有权限,都依赖于此。
  • 使用 show processlist 可以查看数据库的连接状况。
  • 客户端如果长时间没有动静,连接器会自动断开。这个时间由参数 wait_timeout 控制,默认 8 小时。
  • 长连接:连接成功后,如果客户端持续请求,则一直使用同一个连接。
  • 短连接:每次执行完很少的几次查询后就断开连接。
  • 推荐使用长连接。但是 MySQL 执行中的的临时内存是管理在连接对象中的,所以使用长连接可能导致内存占用过大。
    你可以使用两种方法解决:定期断开和重连;执行较大操作后,使用 mysql_reset_connection 重新初始化连接。

2.查询缓存

  • MySQL 拿到查询请求后,会先到缓存中查找。其逻辑和我们常说的缓存逻辑类似。
  • 任何更新操作都会使缓存失效,因此缓存的命中率非常低。
  • 建议你不要使用,且在 8.0 版本后直接删除了缓存功能。

3.分析器

  • 如果没有命中缓存,就要开始执行语句。MySQL 使用分析器对 SQL 语句进行解析。
  • 词法分析:识别 SQL 语句中的字符串分别是什么,代表什么。
  • 语法分析:依据词法分析的结果,判断这个 SQL 语句是否满足 MySQL 语法。

4.优化器

  • 经过分析器分析之后,MySQL 知道你要做什么了。但是在执行之前,要先经过优化器的处理。
  • 同样一条语句可以有多种执行方式,其效率不同,而优化器会决定选择使用哪个方案。例如:
mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

优化器会选择先查询 t1 表还是 t2 表。

5.执行器

  • 通过分析器知道了做什么,通过优化器知道了该怎么做,而执行器会具体执行语句。
  • 首先,执行器会做权限验证。
  • 验证通过,执行器会根据引擎的定义,使用引擎提供的接口,例如执行下面的语句:
mysql> select * from T where ID=10;

ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

在表 T 中,ID 字段没有索引,执行流程如下:
1.调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
2.调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3.执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
4.至此,这个语句就执行完成了。

  • 通过查询日志的 rows_examined 字段,可以查看引擎扫描的行数(具体会有出入,以后会详细说明)

小结

今天我们学习了 MySQL 的逻辑架构,这可以让你对一条 SQL 语句的执行过程有一个初步印象。

专栏老师的思考题:
我给你留一个问题吧,如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

解答:
分析器,Oracle会在分析阶段判断语句是否正确,表是否存在,列是否存在等。MySQL也类似。


以上就是 MySQL 的基础架构,希望你能从全局思考。

注:本文章的主要内容来自我对极客时间app的《MySQL实战45将》专栏的总结,我使用了大量的原文、代码和截图,如果想要了解具体内容,可以前往极客时间

你可能感兴趣的:(1 - 基础架构 - 当你输入一条查询语句,在 MySQL 中发生了什么)