一、Server/Client
# Server端
- mysqld,安装在Linux主机服务器上
- 存储具体数据, 数据管理系统
- 监听网络客户端的请求,并根据请求去读写数据库数据,将结果返回给客户端
# Client端
- 连接数据库,发送sql请求到服务端,获取服务端响应结果
- Navicat,JDNBC等
- 安装mysql后,自带命令行,其实就是进入了mysql的客户端界面
# 模式优点
1. 强制执行并发控制: 多个Client端同时访问Server端,只需把多个请求发给Server端,
由Server端确定如何执行
2. 数据存储和数据访问分离: Server端在某个服务器上,但Client端可在任何地方访问
二、架构图
1.Connectors
- 不同语言与SQL的交互
- MYSQL是一个网络程序,在TCP上定义了自己的应用层协议。要使用MYSQL, 通过代码与MYSQL SERVER建立TCP链接
- 调用SDK,比如JDBC, Native C API, 本质上就是在TCP连接上通过MYSQL协议和MYSQL交互
2. MYSQL Server
2.1 连接层
- 系统(客户端)访问MYSQL服务器前,首先建立TCP链接
- 通过三次握手建立成功后,MYSQL服务器对TCP传输过来的账户密码进行身份验证,权限获取
- 用户名密码不对,返回Access Denied for User 错误, 客户端程序结束执行
- 用户名密码正确,从权限表中查处账户拥有的权限与连接关联
链接数:
- 多个系统,会多次和MYSQL服务器建立链接
- 无限创建与TCP频繁创建带来资源耗尽,性能下降
- MYSQL服务器有 TCP链接池限制链接数,采用长链接模式复用TCP链接
2.2 服务层
SQL Interface
- 接收用户的SQL命令,返回用户需要查询的结果
Parser
- 解析SQL语句进行语法分析和词法分析,将SQL分解成数据结构,并将结构传递到后续步骤。
- 创建好语法树
Optimizer
- 解析后,会根据查询优化器确定SQL的执行顺序,生成一个执行计划
Cache&Buffer
- 如果执行了一条语句,如果在缓存中找到对应的查询结构,那么就直接返回
- 可以在不同客户端之间共享
- 在MYSQL8.0中删除,因为命中率比较低
3. 引擎层
- 插件式的存储引擎,可以在不同业务场景下使用不同的存储引擎,也可以开发自己的存储引擎
- 负责MYSQL中数据的存储和提取,对物理服务器级别维护的底层数据执行
SHOW ENGINES;
MEMORY
InnoDB
PERFORMANCE_SCHEMA
MyISAM
MRG_MYISAM
BLACKHOLE
CSV
ARCHIVE
三、MYSQL执行流程
1. 查询缓存
- Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端,如果没有,就进入解析器阶段
- 查询缓存效率往往不高,MYSQL-8.0弃用该功能
- 之前执行的结果,会通过k-v形式缓存在内存中, k是查询语句,v是查询结果
- 查询执行完成后,执行结果会被存入查询缓存中
1. 两个查询语句在空格,大小写,注释不同时,都会认为是两个不同的k,因此命中率低
2. 查询请求中包含某些系统函数时,比如now,都不会进行缓存
3. 缓存失效:mysql缓存系统会监控涉及到的每个表,表结构数据改变时,缓存就会从高速缓存中
删除,对于更新压力大的数据库来说,查询缓存的命中率会非常低
2. 解析器/Parser
- 对SQL进行分析
- 词法分析:分析SQL字符串中,关键字,表名,列名,空格等
- 语法分析:根据词法分析的结果,语法分析器会根据语法规则,判断语法是否正确
- 如果语法错误,则会 ‘ You hava an error in your SQL syntax’
- 如果语法正确,则会生成一个语法树
3. 优化器
- 经过解析器,MYSQL就知道该条SQL到底要执行什么事
- 一条查询可以有很多执行方式,并返回相同结果,优化器的作用就是找到其中最好的路径
- 优化完毕后,生成一个执行计划
- 比如全表检索或者根据索引检索
4. 执行器
- 执行前需要判断该用户是否具备权限,如果没有则返回权限错误。如果有则执行SQL查询并返回结果
- 存储引擎API只是抽象接口,下面还有存储引擎层,具体实现要看表选择的存储引擎
5. 存储引擎
- 去调用下层的具体的文件系统,来实现读写操作