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