1. 逻辑架构
1.1 连接层
MySQL服务器与客户端建立 TCP 连接后,对客户端传来的账号密码进行验证和鉴权:用户名或密码错误时,返回Access denied for user错误,客户端程序结束执行;用户名和密码正确时,再从权限表查出账号拥有的权限,用于后续鉴权。
每一个连接从线程池中获取线程,连接断开后归还,节省了创建和销毁线程的开销。
1.2 服务层
1.2.1 SQL Interface
接收客户端的SQL语句,并且向客户端返回执行结果。
1.2.2 Caches & Buffers 查询缓存
MySQL内部维持着一些Cache和Buffer,可以在不同客户端之间共享。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 。
Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。
从MySQL 5.7.20开始,不推荐使用查询缓存,MySQL 8.0删除了查询缓存。具体原因如下:
- 缓存命中率低: 查询缓存是把查询结果缓存起来,而不是缓存查询计划。两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。
- 某些请求不会被缓存: 如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、 information_schema、performance_schema数据库中的表,那这个请求就不会被缓存。以某些系统函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW,每次调用都会产生最新的当前时间。
- 缓存失效: MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了 INSERT 、 UPDATE 、 DELETE、TRUNCATE TABLE 、ALTER TABLE 、DROP TABLE 或 DROP DATABASE语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!对于更新压力大的数据库来说,查询缓存的命中率会非常低。
1.2.3 Parser 解析器
在解析器中对 SQL 语句进行语法分析、语义分析:
- 先做“ 词法分析 ”,识别出SQL里面的字符串分别是什么:将"select"关键字识别为一个查询语句,它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列ID”。
- 再做“ 语法分析 ”:对于词法分析的结果,语法分析器判断是否满足MySQL语法 。
同时,会验证该客户端是否具有执行该SQL语句的权限 。解析完成后,生成如下语法树:
1.2.4 Optimizer 优化器
决定使用哪些索引,以及表之间的连接顺序,生成执行计划。
1.2.5 执行器
在执行之前需要判断该用户是否具备权限 。如果没有就会返回权限错误。如果具备权限,就执行 SQL查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。
1.3 引擎层
真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。5.7.37 和8.0.25 版本默认支持的存储引擎如下:
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES