MySQL 体系结构
C/S (Client/Server) 模型
C/S 结构是一种软件系统体系结构,
C 是英文单词 “Client” 的首字母,即客户端的意思,C/S 就是 “Client/Server” 的缩写,即 “客户端 / 服务器” 模式。MySQL
C/S 可如下图所示
MySQL 连接
实现 MySQL 连接的方式主要有两种,
- 基于 TCP/IP 的连接,适用于远程、本地
- 基于 Socket 方式连接,仅限于本地连接
1 | # TCP/IP方式(远程、本地) |
在 Linux 中 /etc/my.cnf
文件中显示(已完成 MySQL 的安装)
1 | socket=/tmp/mysql.sock |
服务器端 (实例)
实例:My sqld + 工作线程 + 预分配内存
功能:管理数据 (增删改查等)
mysqld 逻辑结构
mysqld 的工作模型可分为两块,server
层,引擎层
,server 层可细分为连接层
、SQL层
连接层
- 提供连接协议(socket、TCP/IP)
- 验证用户(账号名、密码、权限)
- 提供用户专用线程
SQL 层
- 接收上层传送的 SQL 语句
- 语法验证模块:验证语句语法,是否满足 SQL_MODE
- 语义检查:判断 SQL 语句的类型 (DDL、DCL、DML、DQL)
- 执行权限检查:对语句执行前,进行预处理,生成解析树 (执行计划)
- 优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划 代价模型:资源(CPU IO MEM)的耗损评估性能好坏
- 执行器:根据最优执行计划,执行 SQL 语句,产生执行结果
- 提供查询缓存(默认是没开启的)常使用 redis、tair 替代查询缓存功能
- 提供日志记录(日志管理章节):binlog,默认是没开启的。
存储引擎层
类似于 Linux 中的文件系统
- 负责根据 SQL 层执行的结果,从磁盘上拿数据
- 将 16 进制的磁盘数据,交由 SQL 结构化化成表
- 连接层的专用线程返回给用户
数据库逻辑结构
- 库:库名,库属性
- 表:表名、属性、
- 列:列名 (字段), 列属性 (数据类型,约束等)
- 数据行 (记录)
库的物理存储结构
- 用文件系统的目录来存储
表的物理存储结构
1 | MyISAM(一种引擎)的表: |
表的段、区、页(16k)
1 | 页:最小的存储单元,默认16k |
执行 SQL 流程
假设忽略权限验证、表操作验证
客户端发送一条 SQL 语句给 MySQL 服务器。
MySQL 服务器先检查查询缓存,如果查询缓存中存在待查询的结果数据,则会立刻返回查询缓存中的结果数据,否则执行下一阶段的处理。
MySQL 服务器通过解析器和预处理器对 SQL 语句进行解析和预处理,并将生成的 SQL 语句解析树传递给查询优化器。
查询优化器将 SQL 解析树进行进一步处理,生成对应的执行计划。
MySQL 服务器根据查询优化器生成的执行计划,通过查询执行引擎调用存储引擎的 API 来执行查询操作。
存储引擎查询数据库中的数据,并将结果返回给查询执行引擎。
查询执行引擎将结果保存在查询缓存中,并通过数据库连接 / 线程处理返回给客户端。
v1.5.2