MySQL语句执行全流程图
2022-01-27 16:35:03 10 举报
MySQL语句执行全流程图
作者其他创作
大纲/内容
header 块头
B+树的每层非叶子节点中的最小记录都会添加该标记
发送请求
2.线程
真实数据
redo log buffer
文件头(File Header)
定时刷新
redo log
3
1
执行 SQL 语句访问数据
提交事务后,binlog 进入 os cache,没有时时刷入磁盘文件,系统宕机,os cache 里的 binlog 会丢失
5.查询优化器
最大记录最小记录(Infimum+supremum)
undo log 日志开始位置
14.将 binlog 信息刷入磁盘 redo 日志中(1) 写入 binlog 文件与 binlog 日志位置(2) 写入 commit 标记
描述数据 2
当前记录在记录堆的位置信息
头结点
单向链表
数据页缓存哈希表key:表空间id号(database、tablename 解析得到) +数据页号(sql 通过一致性算法得到)value:缓存页地址值
13.准备提交事务,可能刷入os cache 或磁盘
主键<列长度,列值>
预留位2
5.将描述数据2转而加载到LRU链表冷数据区域头部,只要加载数据或者修改数据,就把缓存页放入LRU链表头部,最近被访问过的缓存页,一定在LRU链表的头部
多个数据行(User Records)
free链表
解析表名,字段,查询条件
一组数据区
6.执行器
一行数据
线程
MySQL数据库服务器
不同存储引擎,有不同的执行流程
10
span style=\
......
列1的值
1.执行语句,加载磁盘数据到缓存前先看下是否已经加载过了
trailer 块尾(4 byte)
定时任务负责:a.定时将LRU冷数据区域尾部缓存页刷到磁盘,判断是否也在flush链表,是就刷脏,然后删除flush链表数据页和lru链表数据页,空闲数据页重新放回free链表,如果不是就直接释放缓存页,删除lru链表数据页,空闲数据页重新放回free链表b.缓存页不够了,从LRU尾部找一个刷到磁盘,判断是否也在flush链表,是就刷脏,然后删除flush链表数据页和lru链表数据页,空闲数据页重新放回free链表,如果不是就直接释放缓存页,删除lru链表数据页,空闲数据页重新放回free链表c.MySQL不怎么繁忙时,flush链表中的脏数据定时刷到磁盘,删除flush链表数据页和lru链表数据页,空闲数据页重新放回free链表
连接
Tomcat 服务器
当前记录的类型0 普通记录1 B+树非叶子结点记录2 最小记录3 最大记录
描述数据 1
预留位1
缓存页(热数据区域)
数据区(一个数据区包含64个数据页,1MB)
12
磁盘(存放数据)
flush链表
next_record
后台 IO 线程
数据区 1MB
(1) 数据加载到缓存页先进入冷数据区域头部,1s 后,访问这个缓存页
优化sql语句,规定执行流程
描述数据1
redo log 数据结构
分析器
表示**从当前记录的真实数据到下一条记录的真实数据的地址偏移量。**值得注意的是,下一条记录指的并不是按照我们插入顺序的下一条记录,而是按照主键由小到大的下一条记录
执行的SQL语句
缓存页热数据区域优化:只有热数据区域的后3/4部分的缓存页被访问了,才会移动到热数据域的链表头部去
body 块体(496 byte)
数据页目录(Page Directory)
next
表空间
DB_ROLL_PTR
事务提交时的刷盘策略配置
列2的值
7.返回数据
undo log日志编号
升级版LRU链表
数据页(16K)
7
..........
NULL值列表
数据头(记录头信息)
redo log 写入 redo log block中
record_type
pre
语法分析,看是否有错
n_owned
内存(存放数据)
数据页头(Page Header)
数据页号
空闲区域(Free Space)
变长字段的长度列表
(3) 空闲缓存页不足了,挑选冷数据区域的尾部缓存页刷入磁盘,淘汰他们
undo 日志文件
trailer 块尾
客户端发送sql请求
min_rec_mask
2.哈希表中不存在缓存页信息
执行器
提交事务,binlog 进入磁盘文件,系统宕机,磁盘上的 binlog 不会丢失
header 块头(12 byte)
数据页中的偏移量
根据执行计划,调用接口
最优查询路径
文件尾部(File Trailer)
基础节点count
3.SQL接口
当前记录拥有的记录数,即拥有几行记录
缓存页(冷数据区域)
3.读取磁盘上的数据页到空闲缓存页(从free链表取一个描述数据信息,比如描述数据2),同时写入缓存页对应的描述数据
11.调用 sql 接口写 redo log 日志
delete_mask
8.修改数据,更新缓存页2中的数据
4.将描述数据2从free链表中移除6.将数据页缓存哈希表写入 key-value (可能是到这步做的6这个操作)
10.将脏数据添加到flush链表中(flush链表的节点同时也在lru链表中,这边以描述数据2节点为例)
undo log日志类型
表id
sync_binlog=0
LRU链表头指针
5
myisma:磁盘innodb:磁盘membe:内存
多个数据行
数据页
控制客户端连接数
尾结点
12.准备提交事务,可能刷入os cache 或磁盘
sql语句实际执行语句
sync_binlog=1
描述数据2
监听读取请求
申请的N多个redo log block
13
9.写入数据的旧值到undo log 中,便于回滚
4.查询解析器
(2) 冷数据区域的缓存页移动到热数据区域的链表头部
磁盘文件
LRU链表尾指针
链表指针双向链表
隐藏列
InnoDB 存储引擎
body 块体
redo log block
日志类型
Buffer Pool 缓冲池(实际大小:128MB + 800byte)
描述数据3
描述数据 3
一组 redo log
8
os cache
连接器
数据库连接池
缓存页1
binlog 日志文件(磁盘)
14
标记该记录是否被删除0表示没被删除,1表示被删除
.......
undo log 日志结束位置
一组数据区(一组包含256数据区)
数据页(16k)
表空间ID
具体修改的数据
列n的值
9
binlog 刷盘策略
11
单线程可监听多个连接
1.数据库连接池
解析 SQL
优化器
记录头信息
redo 日志文件(磁盘)
获取SQL
heap_no
7.存储引擎
缓存页2
DB_TRX_ID
0 条评论
下一页