ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL之 InnoDB 内存结构 [打印本页]

作者: 祗疼妳一个    时间: 2023-4-4 14:26
标题: MySQL之 InnoDB 内存结构
从MySQL 5.5版本开始默认 使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性,在日常开发中使用非常广泛
下面是官方的InnoDB引擎架构图,主要分为内存结构磁盘结构两大部分。

InnoDB 内存结构

1. Buffer Pool

Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。       
Buffer Pool由 缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制块中存储着对应缓存页的所属的        表空间、数据页的编号、以及对应缓存页在Buffer Pool中的地址等信息.
Buffer Pool默认大小是128M, 以Page页为单位,Page页默认大小16K,而控制块的大小约为数据页的5%,大概是800字节。

注:Buffer Pool大小为128M指的就是缓存页的大小,控制块则一般占5%,所以每次会多申请6M的内存空间用于存放控制块
如何判断一个页是否在BufferPool中缓存 ?
MySQl中有一个哈希表数据结构,它使用表空间号+数据页号,作为一个key,然后缓冲页对应的控制块作为value。

2.Page管理机制

Page页分类

BufferPool的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。
Page根据状态可以分为三种类型:

Page页如何管理

针对上面所说的三种page类型,InnoDB通过三种链表结构来维护和管理
1. free list  表示空闲缓冲区,管理free page


*磁盘加载页的流程: *
2.flush list:表示需要刷新到磁盘的缓冲区,管理dirty page,内部page按修改时间排序。


注: 脏页即存在于flush链表,也在LRU链表中,但是两种互不影响,LRU链表负责管理page的可用性和释放,而flush链表负责管理脏页的刷盘操作。
3.lru list:表示正在使用的缓冲区,管理clean page和dirty page。

缓冲区以midpoint为基点,前面链表称为new列表区,存放经常访问的数据,占63%;后面的链表称为old列表区,存放使用较少数据,占37%
普通LRU算法

LRU = Least Recently Used(最近最少使用): 就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰.

普通LRU链表的优缺点
优点:  所有最近使用的数据都在链表表头,最近未使用的数据都在链表表尾,保证热数据能最快被获取到
缺点:

改进型LRU算法

改性LRU:链表分为new和old两个部分,加入元素时并不是从表头插入,而是从中间midpoint位置插入(就是说从磁盘中新读出的数据会放在冷数据区的头部),如果数据很快被访问,那么page就会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰。

冷数据区的数据页什么时候会被转到到热数据区呢 ?
3. Change Buffer

change Buffer基本概念

Change Buffer:写缓冲区,是针对二级索引(辅助索引) 页的更新优化措施
Change Buffer作用: 在进行DML操作时,如果请求的是 辅助索引(非唯一键索引)没有在缓冲池        中时,并不会立刻将磁盘页加载到缓冲池,而是在CB记录缓冲变更,等未来数据被        读取时,再将数据合并恢复到BP中。
ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写        业务量来进行调整。参数innodb_change_buffer_max_size;

change buffer更新流程

情况1: 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
情况2: 对于普通索引来说,则是将更新记录在 change buffer,流程如下:
写缓冲区,仅适用于非唯一普通索引页,为什么?

如果在索引设置唯一性,在进行修改时,InnoDB必须要做唯一性校验,因此必须查询磁盘,做一次IO操作。会直接将记录查询到BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作。
什么情况下进行 merge ?

将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为merge .
change buffer,实际上它是可以持久化的数据。也就是说,change buffer 在内存中有拷贝,也会被写入到磁盘上,以下情况会进行持久化:
Change Buffer 的使用场景

4. Log Buffer

Log Buffer:日志缓冲区,用来保存要写入磁盘上log文件(Redo/Undo)的数据,日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O。
LogBuffer主要作用是: 用来优化每次更新操作之后都要写入redo log 而产生的磁盘IO问题.

LogBuffer空间满了,会自动写入磁盘。可以通过将innodb_log_buffer_size参数调大,减少磁盘IO频率

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4