MySQL 原理
2021-11-02 11:15:06 0 举报
sql执行流程,主从流程,隔离级别加锁情况
作者其他创作
大纲/内容
节点
读取
.ibd
change bufferB+Tree
利用Bitmap以一定频率merge到真正的数据表中
id主键row锁
IO 线程(后台执行)
写入
管理连接与权限校验
数据异常情况下的恢复
OS Cache
缓存页
flush 链表
8.1 读取脏页
RC
1、MySQL 可以有多个 Buffer Pool,提升多线程的并发访问能力。2、每个 Buffer Pool 包含多个 Chunk,每个 Chunk 包含一系列的描述数据 + 缓存页。相同 Buffer Pool 下的 Chunk 共享 free、flush、lru 等链表。这样,可以实现 Buffer Pool 的动态扩容和缩容,只需要调整 Chunk 的数量即可。
执行器
doublewrite1M
数据页缓存(哈希表)
头节点count = 数量
Service
无索引全部row锁+GAP锁,然后不符合条件的释放锁
一行数据
磁盘区域
提交事务时,根据 sync_binlog 不同,处理不同。② 等于 0 时,写入 binlog 日志文件对应的 os cache。后续,每 1 秒定期将 os chache 刷入 binlog 日志文件。② 等于 1 时,必须写入 binlog 日志文件。
5.准备提交事物,redolog写入磁盘
Buffer Pool(默认 128M,可配置)
LNS 300
3. 更新内存中的数据
工作线程
数据页(16KB)
优化器
每秒调用fsync()
数据字典信息
id非唯一索引row锁+GAP锁
最近被加载的缓存页,会放到 lru 链表头。如果 free 链表空了,不存在空闲的缓存页,则淘汰最不常用的缓存页,将其数据刷到磁盘文件。
id唯一索引row锁
7. 写入 binlog 文件与位置标记 commit 成功
数据页
delete加锁情况
lru 链表
脏页未刷入磁盘,宕机后数据恢复
binlog 日志
innodb_flush_log_at_trx_commit
.....
undolog日志文件
监控 自适应建立hash索引
flush 链表,每个节点指向脏页(数据被修改的缓存页)对应的描述数据。
SQL 写入流程
Buffer Pool 结构
磁盘文件
每秒写入OSBuffer,并调用fsync()
MySQL Master 节点
...
IO 线程
锁信息
连接器
tablespace
4. 写入 redo 日志用于恢复
缓冲池(innodb_buffer_pool)
SQL线程
隔离级别
1. 每秒刷2. 每次事务提交刷3. 空间小于1/2时刷
语法分析与词法分析
6.2 刷入磁盘
doublewrite buffer2M
Buffer Pool 在数据库启动时,即分好描述数据 + 缓存页们。通过 free 链表,可以拿到空闲的描述数据,从而拿到缓存页。
8.2 写入磁盘(随机写入)
2
hash分配指定缓冲池实例
Redo Log Pool
.frm
存储引擎
MySQL Slave 节点
插入缓冲Change buffer
内存区域
索引页
加载
描述数据:缓存页:数据页 = 1:1:1
重做日志文件redo log file
Pahe Cleaner Thread定时刷脏页(领接页)
1. 加载数据如果 Buffer Pool 中不存在
自适应哈希索引
系统空间
0
data 数据
表空间号 + 数据页号 = 缓存页地址
非唯一辅助索引
两次写入
free 链表
执行计划生成与索引选择
同步 binlog
分成热链表和冷链表两分布
每次提交调用fsync()
主从同步
1
顺序IO 速度很快
binlog日志文件
reply 日志
Buffer Pool缓冲池
包含多个
id非唯一索引row锁
描述数据
6.1 写入日志
解析器
无索引全部row锁,然后不符合条件的释放锁(非2PL)
2. 写入数据的旧值便于回滚
0 条评论
回复 删除
下一页