MYSQL : 整体架构

27 阅读4分钟

整体架构

image-20251119072926333.png

  • 连接层:负责接入工作 MYSQL基于TCP建立的网络连接,但是和客户端之间是半双工的通信机制 MYSQL会建立一个连接池(线程),每个连接都由一个线程去处理对应的请求

    show processlist : 查看线程状态,也就等于连接状态 max-connections:最大线程数,可以配置 Threads% :MYSQL统计连接数,通过show status like"Threads%" 查看 一般来说客户端也会建立一个连接池,如Java的druid,这里是维护和数据库的连接避免断开,每次连接的建立都要经历3次握手,连接池实现连接的复用

  • 服务层:接受连接后提供服务,SQL接口统一为入口处理服务

  • 存储引擎:给服务层提供服务,完成对数据

  • 文件系统:主要指MQSQL自定义的文件结构,也包含了操作系统文件系统,我更倾向于这一层是操作系统的文件系统,MYSQL通过OS文件系统去完成数据的持久化工作,这些数据包含了MYSQL的定义都各种文件,日志和数据等

服务层

SQL语句类型

  • DML: 管理语句,已经建好表了,用于表中数据管理,粒度是行,update,delete,insert
  • DDL: 定义语句,用于管理表,粒度是表级别,create,alter,drop
  • DQL:查询语句,select
  • DCL:控制语句,权限控制,grant,revoke
  • TCL:事务控制语句,commit,rollback,setpoint

客户端建立连接后,一条SQL语句执行会依次经历 :SQL接口->解析器->优化器->缓存

  • 有的SQL会不需要缓存
  • 有的SQL可能走到接口就能拿到结果,如select语句缓存命中,就不会走后续流程

服务层组件

  • SQL接口:接收SQL负责分发其他组件,然后处理数据返回值
  • 解析器:解析SQL语句,转换数据库指令
  • 优化器:优化解析器指令执行顺序,找到最佳执行结果
  • 缓存:各种缓存数据,如果命中了,就不会走存储引擎执行具体IO操作 %query_cache_type%:缓存是否开启的变量 %query_cache_size%:缓存大小的变量 %Qcache%:缓存相关统计信息,show status like "%Qcache%" 高版本后的MYSQL取消了SELECT的查询缓存,因为命中率很低。

存储引擎

数据具体的组织由存储引擎来完成

  • 数据的读写
  • 数据怎么存
  • 索引的实现

主流存储引擎:InnoDB,MyISAM

  • show variables like "%storage_engine%" : 查看当前使用的存储引擎

文件系统

主要是mysql的设计的文件类型

  • 日志模块:以下是常用/常听到的日志 bin-log:mysql记录所有读写操作的文件,用于备份 redo-log:innodb引擎的日志,记录重写/重做的日志,用于崩溃后恢复 undo-log:innodb引擎的日志,用于实现事务,如回滚等操作都基于undo-log slow-log:记录慢SQL的日志,需要配置。 error-log:错误日志
  • 数据模块:以下是innodb .ibd:表数据和索引信息,每个表都有 .ibdata1:InnoDB的默认表空间文件,用于存储InnoDB的数据 具体的索引是放在idb和idbdata1看配置。

SQL执行流程

客户端程序从客户端连接池获取连接的流程:

image-20251120074242245.png 如果没有获取到连接就尝试和MQSQL创建新连接,MYSQL收到TCP连接请求后,进行三次握手后流程:

image-20251120074518312.png

  • 校验用户信息:用户,密码
  • 绑定工作线程:检查连接池是否有空闲线程,有就绑定,没有就尝试创建(没有达到最大连接数)
  • 权限查询:绑定完毕,工作线程查询用户权限,方便后续使用,每次执行对应SQL,工作线程都会检查权限

查询语句

image-20251120074856242.png

  • SQL接口:通过sql语句hash后查询缓存,同时处理存储引擎返回结果 如: limit字段的处理是由SQL接口去执行的,一旦数据达到要求立即停止处理 排序,聚合都是SQL接口处理
  • 解析器:语法合规性检查
  • 优化器:选择最优执行方案 效率最高的条件字段放前面 选择效率最高的索引 多表联查选效率最高表先执行
  • 存储引擎:调用操作系统接口查询对应的存储文件数据

写入/修改

image-20251123093304665.png

阅读竹子爱熊猫的MYSQL专栏的文章整理的笔记。