InnoDB缓冲池-页哈希表+控制块+缓存页【数据页】

1、页哈希表

key是数据页的物理地址,value是对应数据页在缓冲池中的控制块地址

当需要访问某个数据页时,InnoDB会根据数据页的物理地址在哈希表中查找相应的位置;如果该位置为空,则表示该数据页不在缓冲池中,需要从磁盘上读取并将其加载到缓冲池中【数据页的物理地址会直接命中磁盘的数据页,不需要检索磁盘的B+树】;如果该位置不为空,则表示该数据页已经在缓冲池中,可以直接从缓冲池中获取数据

为了避免哈希冲突,InnoDB页哈希表采用链表机制。如果多个数据页的哈希值映射到同一个位置,它们会被链接在一起形成一个链表。通过链表机制,InnoDB可以方便地处理哈希冲突,并快速定位和访问数据页

2、控制块

在InnoDB存储引擎中,缓冲池中的每个数据页都有对应的控制块,但每个控制块对应的数据页并不一定在缓冲池中

控制块包含的主要内容

1、缓存页在LRU列表中的地址【InnoDB可以在需要时将缓存页移动到LRU列表的不同位置,以反映其使用情况】

2、数据页在磁盘的地址【当缓存页需要从磁盘加载到缓冲池时,InnoDB可以使用这个地址来定位并读取数据页;同样,当缓存页需要写回到磁盘时也需要这个地址】

3、数据页的状态【是否已修改,是否在LRU列表中】

控制块并不需要保存数据页在缓冲池中的地址,因为缓冲池本身就是一个内存区域,其中包含了多个缓存页;当InnoDB需要访问一个特定的缓存页时,它可以通过控制块找到该页在LRU列表中的位置获取该页的内存地址直接访问【内存地址通常是由缓冲池管理器维护的,并不需要每个控制块单独保存】

LRU列表是一个双向链表,其中的节点是指向控制块的指针,而不是直接指向数据页的指针;当数据页被访问或修改时,对应的控制块可以在LRU列表中移动,以反映该数据页的使用情况;当需要替换数据页时,InnoDB会从LRU列表的尾部选择一个最久未使用的数据页,并通过其控制块找到该数据页在缓冲池中的位置,然后将其替换出去

控制块通过保存数据页在LRU列表中的地址来间接管理B+树中缓存页的可用性和替换策略

这种设计让InnoDB可以高效地管理缓冲池中的数据页,确保最常用的数据页能够保留在内存中,从而提高查询性能

如何初始化控制块?控制块是在数据页首次被加载到缓冲池时初始化的

分配内存:当数据页被加载到缓冲池时,InnoDB会为该数据页分配一个控制块。控制块的大小是固定的,并且与数据页的大小无关。控制块被分配在InnoDB的内存结构中,而不是在缓冲池的直接内存区域

设置页信息:控制块中包含数据页的地址(磁盘上的位置)、页的类型(例如,是否是索引页或数据页)、页的状态(如是否已被修改)等信息。这些数据页的状态信息对于InnoDB的缓冲池管理和数据一致性至关重要

添加数据页到LRU列表:当数据页被加载到缓冲池时,它会被添加到LRU列表的适当位置。LRU列表是InnoDB用于管理缓冲池中数据页使用频率的机制;新加载的数据页通常会被放置在LRU列表的末尾

设置锁和其他同步机制:控制块还可能包含锁信息和其他同步机制,以确保在多线程环境下对数据页的并发访问是安全的

更新统计信息:InnoDB还可能更新内部

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java之项目解析+八股文 文章被收录于专栏

针对Java简历中项目的功能进行提问,大家可以在评论区中解答/讨论;同时提供八股文

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务