MYSQL底层剖析
2022-04-19 23:33:15 9 举报
MYSQL底层剖析
作者其他创作
大纲/内容
SQL线程
悲观锁
trailer
最优查询路径
执行sql语句
... ...
不确定
值B
body(496字节)
共享锁
主库
开始节点
连接
Buffer Pool缓冲池
一行数据
描述数据(冷)
基础节点count=n
20
30
data
总共16KB
从库
MyISAM存储引擎
undo log日志类型
InnoDB的加锁机制
描述数据
4、写入redo日志
8、刷磁盘
缓存页
MySQL
生成锁等待状态=true
flush链表
执行sql
roll_pointer
Tomcat
txr_id = 69
header
事务C(id=69)
缓存页缓存hash表表空间 + 数据页号 = 缓存页地址表空间 + 数据页号 = 缓存页地址表空间 + 数据页号 = 缓存页地址
SQL执行计划
7、写入binlog文件与位置写入commit标记
binlog 日志文件
发送请求
IO线程
线程2
SQL接口
刷入磁盘
insert 的 undo log日志类型:TRX_UNDO_INSERT_REC
undo log 版本链条
发现事务A加锁
锁trx_id = 50等待状态=true
undo日志文件
B+Tree :1. 非叶子节点不存储数据,只存储索引(冗余),可以放更多的索引2. 叶子节点包含所有的索引字段3.叶子节点用指针连接,提高区间访问的性能
定时刷新
聚簇索引:索引和数据存储在同一个文件中,B+ 树的叶子节点存储数据,在使用主键查询时不需要回表。
块编号(4字节)
已写入数据长度(2bit)
第一个日志分组偏移量(2字节)
checkpoint no(4bit)
描述数据(热)
8B
解析SQL
尾部的缓存被访问了会落到LRU链表的头部
15
56
77
redo日志文件
工作线程
数据块引入了跟free链表相似的flush链表,用于记录被修改过的缓存数据。
6、准备提交事务binlog日志写入磁盘
值C
执行器
26字节
结束节点
假设存储数据情况下,一个节点1Kb,那么能存储16个数据
数据库连接池
49
52
数据
2.写入描述信息
支持
SQL解析器
在这样的一套缓存页分冷热数据的加载方案,以及冷数据转化为热数据的时间限制(1000ms)方案,还有就是淘汰缓存页的时候优先淘汰冷数据区域的方案,基于这套方案,就可以解决Buffer Pool数据满的问题了。
...
调用接口完成SQL
56字节
加锁原理
Buffer Pool(128M)
38字节
flush 链表
6B
值A
header(12字节)
事务B(trx_id=60)
3、更新内存数据
这些是行记录
事务B(id=58)
body
binlog日志
LRU 链表
txr_id = 50
后台线程
1、加载缓存数据
乐观锁
聚簇索引
RC隔离级别原理:每次查询都会生成新的ReadView,RR隔离级别原理:在一个事务中生成ReadView后就不再改变了
锁trx_id = 50等待状态=false
binlog日志文件
表锁
事务A(id=50)
关联起来
trailer(4字节)
排它锁
Redo LogBuffer
查询优化器
磁盘文件
undo log日志编号
2、写入数据的旧值便于回滚
加载数据页到Buffer Pool里面
File Header
Page Header
Infimum + suprmum
User Records
Free Space
Page Directory
File Tailer
包含很多数据页,写入缓存页
基于binlog的MySQL主从复制原理
事务A(trx_id=50)
SQL语句
数据行
缓存池淘汰算法
free 链表
8字节
获取sql
脏数据
线程1
18
更新数据
txr_id = 58
5、准备提交事务redo日志刷入磁盘
lru链表
3. 从free链表中移除这个描述数据块
线程
写入binlog日志
ReadView机制:m_ids:这个就是说此时有哪些事务在MySQL里执行还没提交的;min_trx_id:就是m_ids里最小的值;max_trx_id:这是说mysql下一个要生成的事务id,就是最大事务id;creator_trx_id:就是你这个事务的id
InnoDB存储引擎
页锁
创建锁
1. 磁盘上的数据页读取到空闲的缓存页里面去
注意:红色箭头和字体表示数据页加入缓存池的操作过程
行锁
relay日志
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,具体修改的数据
1170 * 1170 * 16 = 大概能存储两千多万个索引
表id
mysql数据库
undo log日志开始位置
free链表
undo log日志结束位置
数据页(16KB)
一个缓存页(16kb) 16 * 1024 B / (8 + 6) B 大约等于1170
0 条评论
下一页