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全新整理八股文 + 场景题 + 算法 精心设计,面试命中率超过80% 专栏优势: 1、问题和答案已经整理到位,答案更专业,可以直接回答,不需要额外总结! 2、场景题讲解清晰,适用于大部分场景的项目,并且持续更新中 3、分享学习心得【知识点的广度和深度,算法有哪些坑,如何准备面试等等】