发布网友 发布时间:2小时前
共1个回答
热心网友 时间:43分钟前
在数据库管理系统中,数据持久化存储于磁盘,尽管内存中的数据不安全,但频繁从磁盘读取数据会导致效率低下,因为每次读取都可能需要系统调用,引起用户态与内核态切换,耗时较长。为提高性能,MySQL的InnoDB引擎采用“页”作为磁盘与内存交互的基本单位,每个页大小通常为16KB。通过页机制,可以一次性读取多条相邻数据至内存,显著提升查询效率。
InnoDB支持多种类型的页,包括存放表空间头部信息、UNDO日志信息的页,以及存放实际表中数据记录的页。这些页统称为索引页或数据页。数据页结构包含额外信息和真实数据两部分,其中额外信息由MySQL自动维护,以方便管理记录,真实数据则是用户定义的数据内容。
数据页中,记录存储结构主要分为两部分:记录的额外信息和真实数据。额外信息包括事务ID、回滚指针、NULL值列表、变长字段长度、逻辑删除标记等,而真实数据则包含用户定义的字段值。记录存储时,MySQL优先使用用户自定义主键作为主键,如果未定义,则采用Unique键,若无Unique键,则系统为表添加隐藏列row_id作为主键。
每个数据页中记录按主键值顺序串联成链表,这使得数据可以被顺序读取。但当数据量过大时,查询效率会降低。针对这一问题,InnoDB引入了Page Directory机制,通过将记录分组,提高了查询效率。
记录分组规则下,数据页中维护着多个槽位,每个槽位指向主键值最大的记录。以插入数据为例,通过比较主键值与槽位,数据被正确插入相应组中。插入操作可能触发数据页,即数据量超过页容量,系统将数据分页并重新调整指针链接,以保持链表连续性。
实际应用中,数据主键与业务主键常被同时使用。数据主键用于自增以减少插入时的数据迁移,而业务主键则是程序生成的无规律标识符,通过二级索引与数据主键关联,便于查询操作。查询过程首先通过索引定位数据所在页,然后通过分组规则及指针链表定位具体记录。