1、逻辑架构
1.1、连接层
客户端访问MySQL服务器时,进行TCP连接。
- 一个系统只会和MySQL服务器建立一对一的连接吗?
- 多个系统都可以和MySQL建立连接,每个系统建立的连接也可以不止一个。为了解决TCP连接无限创建与TCP频繁创建销毁带来的资源耗尽、性能下降的问题。MySQL服务器里有专门的TCP连接池限制连接数,采用长连接模式复用TCP连接,来解决上述问题。
连接层还设置线程池与客户端进行交互,每个连接从线程池中获取线程,省去了创建和销毁线程的开销。
1.2、服务层
- SQL接口:接收用户的 SQL命令并返回结果
- 解析器:对SQL命令创建语法树
- 查询优化器:根据语法树确定SQL的执行路径,生成执行计划
- 查询缓存:MySQL8.0中删除
1.3、引擎层
插件式的存储引擎,负责了MySQL中的数据的存储和提取,对物理服务器级别维护的底层数据执行操作。
2、SQL执行流程
查询流程:
1、 查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端。如果没有的话,进入解析阶段。之前执行过的语句及其结果以key-value
的形式缓存在内存中。
大多数情况下查询缓存是鸡肋的原因?
查询缓存弊大于利,查询缓存的失效非常频繁。
1、这里的查询缓存不是缓存计划,而是缓存结果。两个查询请求在任何字符上的不同(如空格),都会导致缓存不命中,从而导致MySQL的查询缓存命中率不高。
2、对于时效性函数会出错,比如使用NOW获取现在的时间,而缓存会直接返回结果,从而导致使用了NOW但是返回的并不是现在的时间。
3、缓存失效的情况,对于频繁使用更新删除等操作的数据库来说,MySQL的缓存系统在检测到表数据更改后,使用该表的所有高速缓存查询都将无效并从高速缓存中删除。查询的命中率非常低。
一般是在静态表中使用查询缓存,即是一种极少更新的表。并且也可以使用按需使用的方式。目前在MySQL8.0中已经删除了查询缓存。
2、解析器:在解析器中对SQL语句进行语法分析、语义分析
词法分析
分析器先先做词法分析,对于输入的由多个字符串以及空格组成的一条SQL语句,识别出里面的MySQL关键字以及其中的字符串代表什么。
语法分析
语法分析器根据语法规则,判断输入的SQL语法是否满足MySQL语法。
3、优化器:在优化器中会确定SQL语句的执行路径,一条查询可以有很多种执行方式,最后都会返回相同的结果。优化器的作用就是找到其中最好的执行计划。优化器分为两个部分,分别是逻辑查询的优化以及物理查询的优化。
物理查询优化:通过索引以及表连接方式等技术来进行优化
逻辑查询优化:通过SQL等价变换提升查询效率。即换一种查询写法来提升执行效率。
4、执行器:
在执行之前判断用户是否有权限,有权限的话就打开表继续执行。执行器根据表的引擎定义,调用存储引擎API对表进行读写。