MySQL中的数据组织是以页为单位的
每一页中的信息包括:
页头
记录页面的控制信息,共占56字节,包括页的左右兄弟页面指针(用来连接相邻的页面),页面空间使用情况等
虚记录
最大虚记录: 比页内最大主键还大
最小虚记录:比页内最小主键还小
记录堆
行记录存储区: 分为有效记录和已删除记录两种
自由空间链表
已删除记录组成的链表
未分配空间
页面未使用的存储空间
页尾
页面组后部分,占8个字节,主要存储页面的校验信息
页内记录维护
顺序保证
MySQL中的数据是逻辑连续的
页与页之间的关系图
插入策略
自由空间链表
未分配空间
插入数据时,应该先从自由空间链表中找地插,实在没有空间了再存入未分配空间中,这样空间的利用率就高了
如果页面中已删除的记录很多,但是又直接从未分配空间中插入数据,则会导致页面中的空洞越来越多,表占用的空间很大,但是有效的记录又很少
页内查询
遍历
二分查找
这样,就保证了读和写的效率,读使用slot进行二分查找,写使用逻辑连续
MySQL InnoDB索引实现原理及使用优化分析
聚簇索引
数据存储在主键索引中
数据按主键顺序存储
自增主键VS随机主键