IT袋

当前位置:主页 > 经验教程 > 硬件教程 >

InnoDB内存结构详解

InnoDB内存结构详解 深入解析InnoDB的内存结构

时间:2023-09-23 22:59:29 来源:IT袋 作者:苏晓敏
导读:InnoDB内存结构详解,关于InnoDB内存结构详解的内容,接下来IT袋网小编就来介绍。 InnoDB内存结构详解 buffer pool buffer pool是InnoDB的缓存,用来存放各种数据,包括 索引页 (index page)、 数据页 (

InnoDB内存结构详解

关于InnoDB内存结构详解的内容,接下来IT袋网小编就来介绍。

InnoDB内存结构详解

InnoDB内存结构详解

buffer pool

buffer pool是InnoDB的缓存,用来存放各种数据,包括索引页(index page)、数据页(data page)、undo页、插入缓冲、自适应哈希索引(AHI)、innodb存储的锁信息、数据字典等。把磁盘上的数据加载到缓冲池中(通过预读机制加载当前页、相邻页),可避免每次访问都进行磁盘IO,起到加速访问的作用。应用程序在对数据库执行增删改操作的时候,实际上主要都是针对内存里的buffer pool中的数据进行的。

buffer pool包含三种数据类型:

  • free page:从未用过的页。
  • clean page:干净的页,即数据页的数据和磁盘一致。
  • dirty page:脏页,即数据页的数据和磁盘不一致。

针对这3种页,InnoDB使用3种链表维护:

  • free list:空闲页链表,管理free page。
  • flush list:脏页链表,管理dirty page并在某个时刻对该链表的脏页进行刷盘,按脏页的修改时间排序,更新操作较早的脏页先被刷盘。
  • lru list:正在使用的内存页链表,里面包含clean page和dirty page,也就是说lru list中的页包含flush list中的所有脏页。lru list遵循lru算法管理缓存页。

InnoDB需要保证buffer pool的数据都是热点数据,将无效的预读数据快速删除、不将读入后立即使用的数据替换热点数据,就引入了变种lru算法(新生代+老生代、老生代停留时间窗口)来解决“预读失效”与“缓冲池污染”的问题。通过下列指令可以查询到数据库设置冷热分界线和成为热块的所需时间:

show variables like 'InnoDB_old_blocks_pct'; -- 单位%,默认37,代表冷数据占比
show variables like 'InnoDB_old_blocks_time'; -- 单位ms,默认1000

Mysql5.7.5之后,buffer pool有分块(chunk)的特性,即一个buffer pool实例是由多个块组成,每个块的块内空间是连续的,块与块之间则是离散的。分块是为了方便用户在mysql运行期间能够调整buffer pool的大小。

注意,为了提高读写性能,避免过少的数据刷盘或随机IO,buffer pool一般不会对单个Page实时刷盘,所以这就出现了缓存和磁盘的一致性问题,InnoDB通过引入redolog来保存数量操作记录从而解决此问题,见下文。

change buffer

change buffer(写缓存)是一种特殊的数据结构,可以避免数据更改时因为隐式查询数据带来的磁盘IO。change buffer默认占buffer pool的 25%,最大允许占50%。可以根据写业务的量调整,写操作越频繁,change buffer带来的性能提升越明显。

相关阅读