MYSQL架构、执行过程和顺序
一、前言
1.1、说明
就MySQL的架构,以及执行过程、sql执行顺序,以及一些相关学习分享内容。
在参考文章的基础上,会增加自己的理解、看法,希望本文章能够在您的学习中提供帮助。
如有错误的地方,欢迎指出纠错,互相学习,共同进步。
1.2、参考文章&视频
十分感谢文章在学习过程中提供的帮助
article:
-
https://www.cnblogs.com/wyq178/p/11576065.html
-
https://juejin.cn/post/7002604517913001997
-
https://blog.csdn.net/qq_48157004/article/details/128590851
-
https://cloud.tencent.com/developer/article/1882003
-
https://cloud.tencent.com/developer/article/1115019
-
https://www.cnblogs.com/ydyxcode/p/17918605.html
vedio:
- 尚硅谷-MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板:p109
二、MySQL逻辑结构
2.1、MySQL数据库架构主要层次
MySQL采用客户端-服务端(CS)架构,结构可以分为如下层
-
客户端(Connectors):用户与数据库进行交互的部分,可以是命令行工具、图形用户界面(GUI)工具或应用程序。客户端通过网络与服务器通信,发送SQL查询并接收结果。
JDBC(Java DataBase Connectivity)是一种用于执行SQL语句的 Java API,是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够交给数据库执行SQL语句。具体的实现通常由不同的数据库厂商提供,每个厂商会根据JDBC规范实现自己的驱动程序。常见的JDBC驱动实现包括:
- Oracle JDBC Driver:用于连接Oracle数据库的驱动程序。
- MySQL Connector/J:MySQL数据库的官方JDBC驱动。
- PostgreSQL JDBC Driver:用于连接PostgreSQL数据库的驱动。
- Microsoft JDBC Driver for SQL Server:用于连接SQL Server的驱动。
相关jdbc内容参考文章
-
服务端:MySQL服务器负责处理客户端请求,执行SQL语句,并返回结果。它包括多个模块,如解析器、优化器、执行引擎等。
- 连接层:系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。
- 服务层:接收用户的SQL命令、解析器中对 SQL 语句进行语法分析、语义分析,以及SQL优化等。
- 引擎层:属于MySQL服务端的组成部分。位于服务端的架构中,负责实际的数据存储、读取和管理。每个存储引擎具有不同的功能和特性,例如事务支持、表锁或行锁、外键支持等。MySQL支持多种存储引擎(如InnoDB、MyISAM等),每种存储引擎有不同的特性和性能表现。选择合适的存储引擎可以根据应用需求来优化性能和功能。
-
存储层:所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在文件系统上,以文件的方式存
在的,并完成与存储引擎的交互。当然有些存储引擎比如InnoDB,也支持不使用文件系统直接管理裸设
备,但现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以使用本地磁盘,可以使用
DAS、NAS、SAN等各种存储系统。
2.2、MySQL数据库架构图
架构图(具体详情分析可见2.3部分):
架构图2
对存储引擎描述比较详细的一张架构图(可用于参考,本文章的侧重点不在存储引擎,不同的存储引擎内部实现不同)
比较官方的一张架构图
内容详解:
- Connetors:用于连接和与MySQL数据库进行交互的驱动程序或库(由MySQL官方开发和维护),是MySQL服务器之外的客户端程序,与具体语言相关
- Connection Pool:连接池,提供多个客户端与服务器端交互的线程
- Management Services & Utilitiees:基础服务组件
- SQL Interface:SQL接口,接受SQL指令,返回查询结果
- Parser:解析器,用于语法解析,语义解析,生成语法树
- Optimizer:优化器,核心组件,对SQL进行优化
- Caches & Buffers:查询缓存,以key-value的方式缓存查询结果(mysql8.0移除)
- Pluggable Storage Engines:插件式存储引擎,与底层的文件系统进行交互
- File system:文件系统
- Files & Logs:日志文件
执行顺序:
-
客户端需要查询一条数据
-
客户端通过Connetors向客户端发起链接
-
服务端通过Connection pool接受链接,并分配一个线程用于执行后续内容
-
SQL Interface
-
Caches & Buffers(5.7):查询缓存
-
Parser
-
Optimizer
-
Pluggable Storage Engines
-
File system:需要从磁盘中加载到内存中,进行处理
-
Caches & Buffers(5.7):缓存查询结果
各层内容:
- 客户端:Connetors
- 连接层:Connection Pool
- 服务层:SQL Interface、Parser、Optimizer、Caches & Buffers
- 引擎层:Pluggable Storage Engines
- 存储层:File system
2.3、架构剖析
1. Connetors
用于连接和与MySQL数据库进行交互的驱动程序或库(由MySQL官方开发和维护),是MySQL服务器之外的客户端程序,与具体语言相关
2. 连接层
系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。
- 建立和维护连接
连接器负责与客户端的通信,其使用的是半双工模式(一种通信方式,其中通信双方可以交替地发送和接收数据,但不能同时进行发送和接收)。首先是与访问的客户端建立TCP连接,服务器有专门的TCP
连接池,采用长连接模式复用TCP
连接,经过三次握手建立连接成功后,之后会对TCP传输过来的账号密码做身份认证、权限获取。在服务器内部,每个client连接都有自己的线程,即TCP连接都会分配给一个线程去执行后续的流程。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中,缓存了线程(线程池),因此不需要为每个client连接单独创建和销毁线程 ,省去了创建和销毁线程的开销。
- 认证和权限获取
完成与访问客户端的TCP连接后,会对TCP传递过来的账号密码进行身份认证。
如果账户和密码错误,会报错Access denied for user 'root'@'localhost' (u