MySQL 入门(1):查询和更新的内部实现
摘要
在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
查询语句和结果。你可以理解为这是一个map
:key
是查询的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;
相关文章