MySQL 入门(1):查询和更新的内部实现

2020-05-15 00:00:00 数据 语句 更新 磁盘 分析器

摘要

在MySQL中,简单的CURD是很容易上手的。

但是,理解CURD的背后发生了什么,却是一件特别困难的事情。

在这一篇的内容中,我将简单介绍一下MySQL的架构是什么样的,分别有什么样的功能。然后再简单介绍一下在我们执行简单的查询和更新指令的时候,背后到底发生了什么。

1 MySQL结构

在这一小节中,我会先简单的介绍一下各个部分的功能。随后,将在第二、第三节中详细介绍。

先来看一张图:


简单的来讲一讲:

1.1 连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接。

在客户端输入了账号密码之后,如果此时账号密码验证通过,连接器将会和客户端建立一条TCP连接。这个连接将会在长时间无请求后被连接器自动断开(默认是8小时)。

此外,在连接建立后,如果管理员修改了这个账户的权限,也不会对当前的连接有任何的影响,当前连接所拥有的权限还是之前未修改前的权限。

1.2 分析器

分析器有两个功能:词法分析、语法分析。

对于一个 SQL 语句,分析器首先进行词法分析,对sql语句进行拆分,识别出各个字符串代表的含义。

然后就是语法分析,分析器根据定义的语法规则判断sql语句是否满足 MySQL 语法。

所以,如果我们看到You have an error in your SQL syntax这么一段话,就可以知道这个错误是由分析器返回的。

1.3 缓存

这里的缓存会保存之前的sql查询语句和结果。你可以理解为这是一个mapkey是查询的sql语句,value是查询的结果。

并且,在官方手册中,有这么一句话:

Queries must be exactly the same (byte for byte) to be seen as identical.

也就是说,查询语句必须得和之前完全一致,每一个字节都一样,大小写敏感,甚至不能多一个空格。

但是,这里的缓存是非常容易失效的。为了保证查询的幂等性,当某一张表有数据更新后,这个表的缓存也将失效。

所以,对于更新压力大的数据库来说,查询缓存的命中率会非常低。建议只在读多写少的数据库开启缓存。

但是,在MySQL8.0以后,已经删除了缓存功能。

1.4 优化器

查询优化器的任务是发现执行SQL查询的佳方案。大多数查询优化器,包括MySQL的查询优化器,总或多或少地在所有可能的查询评估方案中搜索佳方案。

简单来说,优化器就是寻找一个快能够查询到数据的策略。

1.5 执行器

在通过了上述的过程后,Server层已经解析出了需要处理的数据是什么,应该怎么做。

随后会进行权限的判断,如果当前的连接拥有目标表的权限,则会调用存储引擎开放的接口,处理需要处理的数据。

到这里MySQL的基本架构就讲完了。但是因为我省略了大部分的细节,只讲了这么一小部分,可能会导致你的疑问增加了。

不过没关系,我们接着往下看,用实际的例子来解释这里的每一部分,可能会更容易理解。

2 查询

我们从这么一条sql讲起:

select * from T where ID = 1;

相关文章