MySQL----InnoDB体系架构学习笔记

数据库体系架构

回顾复习一下体系架构:
首先MySQL数据库的架构如下:
借鉴https://blog.arstercz.com/sre-mysql-note/博客

InnoDB体系架构

1.架构图

在这里插入图片描述

可以看到innodb的整个体系架构就是由多个
内存块组成的缓冲池及多个后台线程构成。
缓冲池缓存磁盘数据(解决cpu速度和磁盘速度的严重不匹配问题),
后台进程保证缓存池和磁盘数据的一致性(读取、刷新),并保证数据异常宕机时能恢复到正常状态

2.四个线程

1.master thread:
将缓冲池中的数据异步刷新到磁盘
最高级别线程
分为两种操作
每1s的操作:
日志缓冲刷新到磁盘,尽管事务没提交(总是)
insert buffer (可能)
最多刷新100个脏页到磁盘(可能) 通过innodb_max_dirty_pages_pct这个参数控制,超过90就进行操作
没活动,切换到background loop
每10s操作:
刷新100或者10个脏页到磁盘(总是)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的UNDO页(总是)
background loop操作:
删除无用的undo页(总是)
合并20个插入缓冲(总是)
后续美1s和每10s的脏页刷新拿到一个单独的page clean thread,减轻master thread压力 提高并发性
2.io thread:
异步io处理,可通过参数调整读写的io线程数量
3.purge thread:
回收事务被提交后的undo页
undo保存的就是修改前的数据
4.page clean thread:
脏页的刷新操作单独拿出来

3.缓冲池

缓冲池是一块内存区域,通过内存的速度来弥补cpu和磁盘的交互
可以设置多个缓冲池实例 每个页根据哈希值平均分不到不同的实例中,
提高并发,innodb_buffer_pool_instances控制

一般DBA会将innodb_buffer_pool_size调大一点,来缓存更多的数据和索引。

缓冲池是由LRU算法来进行管理的
LRU链表,分为两个子链表,new和old,old占37%,
超过block_time参数就会将old移至new,new是活跃的数据页
midpoint机制,

在这里插入图片描述

上图对于的
Buffer pool size 总共多少页
Free buffers free链表中页的数量
Database pages LRU 页数量
Old database pages LRU old页数量 = LRU + unzip_LRU
Modified db pages 脏页的数量

--查看LRU每个页的具体信息
select table_name,space,page_number,page_type from innodb_buffer_page_lru where space = 1 limit 10;

脏页:缓冲池中的页和磁盘中的页数据不一致,即被LRU链表修改过的页
同时存在于LRU和FLUSH中
flush 链表:存储脏页,用于回刷到磁盘

redo log buffer 将重做日志信息放在这里 然后以特定的条件和频率进行刷回道重做日志文件

4.checkpoint机制

事务数据库系统目前凑采用wal 策略,
提交事务的时候,先写重做日志,再修改页

脏页的刷新由checckpoint机制处理

checkpoint好处:
缩短恢复数据库的时间,只根据每次checkpoint之后去重做恢复
缓冲池不够用的时候 将脏页刷新回磁盘
重做日志不可用时刷新磁盘

可以通过LSN 版本号来确定位置

Checkpoint分类
sharp checkpoint 数据库关闭时
innodb_fast_shutdown =1 控制

fuzzy CheckPoint
分为四种
master 线程的每10s操作
LRU的checkpoint 为了保证LRU有可用的列,会从尾部删除,
如果尾部刚好有脏页的时候刷回,默认为可用100页
Async/Sync Flush 重做日志不可用的时候,将fulsh链表的刷新
dirty page too much脏页太多的情况下,目的是为了保证缓冲池中有足够的可用页,
innodb_max_dirty_pages_pct参数控制 当超过多少就刷回一部分

5.innodb关键特性

1.insert buffer
非聚集索引插入的离散性
即合并插入

2.doublewrite两次写
数据页的可靠性
当对缓冲池中脏页刷新时,先通过函数将脏页复制到内存中的doublewrite buffer 大小为2MB中,然后调用同步函数,同步磁盘,因为磁盘的doublewrite页是连续的128个页 2个区 所以写的很快,写完成之后,再将doublewrite buffer写入各个表空间中,此时写入是离散的
--可以查看写入的页数和写入的次数,为64:1 大于这个值说明压力有点大
show global status like 'innodb_dblwr%';


3.自适应hash索引
对某个页的连续访问模式是一致的
Hash只适用于等值查询

4.异步IO AIO
将多个IO合并成一个IO,像扫描索引的时候

5.刷新邻居页
刷脏页的时候 会讲该页所在区的所有脏页刷回磁盘
这个特性主要针对于HDD磁盘,对于SSD因为IOPS很高,所以不需要开启刷新
邻结数据页。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔不是鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值