MySQL的整体流程图
2021-07-04 20:15:28 0 举报
MySQL的整体流程图
作者其他创作
大纲/内容
描述数据
3、更新内存数据
一行数据
更新一条数据:1、先从磁盘里找到该条数据,加载到buffer pool中2、把数据旧的值写到undo日志文件中3、在buffer pool里更新数据4、将对数据的修改记录到redo log buffer中5、提交事务的时候将redo日志写入磁盘redo日志文件中 这一步骤有一个参数配置:innodb_flush_log_at_trx_commit : 0 1 2可选 0:提交事务的时候,不会把redo log buffer里的数据刷入磁盘文件的,此时可能你都提交事务了,结果mysql宕机了,然后此时内存里的数据全部丢失 1: 必须把redo log从内存刷入到磁盘文件里去,只要事务提交成功,那么redo log就必然在磁盘里了 2: 提交事务的时候,把redo日志写入磁盘文件对应的os cache缓存里去,而不是直接进入磁盘文件,可能1秒后才会把os cache里的数据写入到磁盘文件里去6、提交事务的时候,同时会写入binlog sync_binlog:参数控制binlog刷盘策略 默认:0 0: 不是直接进入磁盘文件,而是进入os cache内存缓存 1: 强制在提交事务的时候,把binlog直接写入到磁盘文件里7、在redo日志中写入commit标记 8、将脏数据,刷回数据库
用户
最大/小记录
缓存页
1、数据加载到一个缓存页,free链表里会移除这个缓存页,然后lru链表的冷数据区域的头部会放入这个缓存页2、修改了一个缓存页,那么flush链表中会记录这个脏页,lru链表中还可能会把你从冷数据区域移动到热数据区域的头部去3、查询了一个缓存页,那么此时就会把这个缓存页在lru链表中移动到热数据区域去,或者在热数据区域中也有可能会移动到头部去
定时把LRU尾部刷盘
Undo log
8、后台线程把脏数据刷到磁盘
开始节点
1、从磁盘读数据件
Innodb
储存引擎
后台线程
6、准备提交事务,写磁盘
多数据行
Tomcat
m_idsmin_trx_idmax_trx_idcreator_trx_id
解决预读全表扫描
数据页目录
数据页(热)
表示脏缓存页
结束节点
binlog日志文件
SQL接口
数据库连接池
1、性能指标 QPS TPS IOPS: 200 IOPS,意思就是说每秒可以执行200个随机IO读写请求 吞吐量:这个指的是机器的磁盘存储每秒可以读写多少字节的数据量 latency:这个指标说的是往磁盘里写入一条数据的延迟。
SQL解析器
多版本链条
undo log日志类型
基础节点count=n
Free链表
Header12kb
连接
redo log block
trailer4kb
一个是m_ids,这个就是说此时有哪些事务在MySQL里执行还没提交的;一个是min_trx_id,就是m_ids里最小的值;一个是max_trx_id,这是说mysql下一个要生成的事务id,就是最大事务id;一个是creator_trx_id,就是你这个事务的id
Buffer Pool
表空间号+数据页号:缓存页的地址
查询优化器
执行器
roll_pointer
body496kb
MySQL
SQL
Redo Log磁盘文件表空间号+数据页号+偏移量+修改几个字节的值+具体的值
Redo Log
空闲数据
SQL解析
主键
uddo log日志编号
LRU链表(冷热分离)(冷占37%)
txr_id = 50
优化查询
磁盘文件
数据页
表Id
线程
ReadView机制
头结点
执行SQL
4、写redo日志到内存
txr_id = 48
数据页(冷)
hash表记录缓存页
undo log日志开始位置
文件尾部
数据页头
表示空缓存页
存储引擎
undo log日志结束位置
这里还有一个优化点,只有在热数据后3/4中,再次访问才会放到链表头
7、在redo日志中写入commit标记
文件头
Redo log buffer
2、旧值写入
LRU链表的冷数据区域的尾部刷盘,清空
尾结点
数据页16KB
第一次访问
5、准备提交事务,写磁盘
新值
更新内存数据
原始值
Flush链表
事务Aid=50
调用接口完成SQL语句
优化方案:1、多个Buffer Pool优化并发能力(必须大于1G才能使用)2、通过chunk来支持数据库运行期间的Buffer Pool动态调整3、buffer pool的真实的数据结构,是可以由多个buffer pool组成的,每个buffer pool是多个chunk组成的
0 条评论
下一页