一、记录存储
Page: 每次从磁盘读取加载一个page(16Kb)的数据
1、页头:56字节,左右双向指针---双向链表
2、虚记录:(聚簇索引原理)
最大虚记录:比页内最大主键还打
最小虚记录:比页捏最小主键还小
3、记录堆:(黄色部分)
4、自由空间链表:(蓝色部分)
5、未分配空间
6、slot区:(倒数第二行灰色方格区域)
7、页尾
二、页内记录维护
1、顺序保证(二选一)
物理有序 :查找好事,插入得移动数据
逻辑有序:查询慢(遍历链表),插入(链表插入)
2、插入顺序
自由空间链表
未分配空间
3、页内查询
遍历
二分查找
三、InnoDB内存管理
1、页面管理
空闲页
数据页
脏页:发生修改的页面
2、页面淘汰
LRU:内存淘汰算法,访问哪个数据就把该数据放到表头,淘汰表末的数据
全部扫描:5T的数据,热数据被淘汰了,所以不能简单这么搞!!
解决思路:避免热数据被淘汰
LFU:按照访问评率进行淘汰,redis
3、InnoDB内存管理
Buffer Pool:预分配内存池
Page:Buffer Pool 最小单位
Free List:空闲页组成的链表
Flush List:脏页组成的链表
Page Hash:维护内存Page和文件配置的映射关系
LRU:内存淘汰
4、LRU
页面装载:Free List取出空闲Page加载数据,Page Hash建立关系,写入数据后把数据和LRU_old关联
页面淘汰:没有空闲页,从LRU尾部进行淘汰,如果LRU尾部数据再使用,那么从尾部开始向前找脏数据进行刷盘后淘汰。淘汰后重新装载数据。
冷热数据交互:
old=>new:InnoDB_old_blocks_time,数据在old存活时间大于此值,有机会进入new(数据还得被访问)
new=>old:随着热数据到冷数据中迁移,new里面的数据会增多,最后只要保持new占用5/8的数据就可以。
冷热数据变化频繁:数据移动太多,再加上锁的开销,数据库压力比较大,怎么解决。
设计思路:减少移动次数。聚合移动次数
a.free_page_clock:Buffer Pool淘汰页数
b.LRU_new 长度1/4
当free_page_clock-上次移动到Header是free_page_clock