MySQL(高级特性篇)07章——InnoDB数据存储结构

一、数据库的存储结构:页

索引与存储:索引结构提供高效索引方式,索引信息数据记录保存在文件的结构中

存储引擎职责:索引在存储引擎中实现,MySQL 的存储引擎负责表中数据的读写,不同存储引擎数据存放格式一般不同,如 Memory 引擎不用磁盘存储数据

(1)磁盘与内存交互基本单位:页

  1. 页的大小:InnoDB 将数据划分为页,页大小默认 16KB
  2. 交互单位页是磁盘内存交互的基本单位,一次至少从磁盘读 16KB 内容到内存,或把内存中 16KB 内容刷新到磁盘
  3. 读取方式:数据库读数据时,不论一行或多行,都加载行所在的页是数据库管理存储空间和 I/O 操作的基本单位,一个页可存多个行记录
  4. 效率考量:记录按行存储,但不以行为读取单位,否则一次 I/O 仅处理一行数据,效率极低
  5. 图示:

(2)页结构概述

InnoDB 中,页与页之间无需在物理结构上相连,通过双向链表关联即可。每个数据页内的记录按主键值从小到大组成单向链表,同时每个数据页会为其中的记录生成页目录。当通过主键查找记录时,可利用页目录进行二分法快速定位到对应的槽,再遍历该槽对应分组里的记录,从而迅速找到目标记录

(3)页的大小

  1. 不同的DBMS的页大小不同。比如在MySQL的InnoDB存储引擎中,默认页的大小是16KB,我们可以通过下面的命令来进行查看:
  2. SQL Server中页的大小为8KB,而在Oracle中我们用术语“块”(Block)来代表“页”,Oracle支持的块大小为2KB,4KB,8KB,16KB,32KB和64KB

(4)页的上层结构

  1. 另外在数据库中,还存在着区(Extent)、段(Segment)和表空间(TableSpace)的概念。行、页、区、段、表空间的关系如下图所示:
  2. 区(Extent):是比页高一级的存储结构,InnoDB 里一个区含 64 个连续的页。因页默认 16KB,所以一个区大小为 1MB
  3. 段(Segment):由一个或多个区组成,在文件系统中是连续存储空间(InnoDB 中为连续 64 个页),但段内区与区不要求相邻。段是数据库分配单位,不同数据库对象以不同段形式存在,创建表和索引时会分别创建表段和索引段
  4. 表空间(TableSpace):是逻辑容器,存储对象为段。一个表空间可有一个或多个段,一个段仅属一个表空间。数据库由一个或多个表空间组成,表空间管理上分为系统、用户、撤销、临时表空间等

二、页的内部结构

数据16KB大小的存储空间被划分为七个部分,分别是文件头部(File Header)、页面头部(Page Header)、最大最小记录(Infimum+supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)、文件尾部(File Trailer)

页结构的示意图如下所示:

这七个部分的作用分别如下,我们简单梳理如下表所示:

(1)第1部分:File Header(文件头部)和File Trailer(文件尾部)

2.1.1File Header(文件头部)(38字节)

  1. 作用:描述各种页的通用信息(比如页的编号、其上一页、下一页是谁
  2. 大小:38字节
  3. 构成
  4. FIL_PAGE_OFFSET:InnoDB 中每个页都有唯一的页号,通过页号能唯一确定一个页
  5. FIL_PAGE_TYPE:这个代表当前页的类型
    类型名称 十六进制 描述
    FIL_PAGE_TYPE_ALLOCATED 0x0000 最新分配,还没有使用
    FIL_PAGE_UNDO_LOG 0x0002 Undo日志页
    FIL_PAGE_INODE 0x0003 段信息节点
    FIL_PAGE_IBUF_FREE_LIST 0x0004 Insert Buffer空闲列表
    FIL_PAGE_IBUF_BITMAP 0x0005 Insert Buffer位图
    FIL_PAGE_TYPE_SYS 0x0006 系统页
    FIL_PAGE_TYPE_TRX_SYS 0x0007 事务系统数据
    FIL_PAGE_TYPE_FSP_HDR 0x0008 表空间头部信息
    FIL_PAGE_TYPE_XDES 0x0009 扩展描述页
    FIL_PAGE_TYPE_BLOB 0x000A 溢出页
    FIL_PAGE_INDEX 0x45BF 索引页,也就是我们所说的数据页
  6. FIL_PAGE_PREV和FIL_PAGE_NEXT:InnoDB 以页为单位存储数据,若数据分散于多个不连续页,通过 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 分别记录本页的上一页下一页页号,构建双向链表将众多页串联,实现页在逻辑上连续非物理上连续
  7. FIL_PAGE_SPACE_OR_CHKSUM:代表当前页面的校验和
    1. 校验和定义:对于长字节串,通过某种算法计算出一个较短的值代表它,这个短值即校验和。比较长字节串前先比较校验和,若不同则长字节串肯定不同,可节省直接比较的时间
    2. FIL_PAGE_SPACE_OR_CHKSUM 属性:文件头部尾部都有该属性,代表当前页面的校验和
    3. 作用原理:InnoDB 以页为单位处理数据,修改后需同步到磁盘。若同步一半断电致页传输不完整,可对比文件
### 回答1: 确实,MySQL的varchar类型在InnoDB存储引擎中的存储结构比较复杂。在InnoDB中,每个记录都被存储为一个B+树节点,每个节点都有一个固定大小的页,通常为16KB。 当一个varchar类型的列被插入到InnoDB表中时,它会被拆分成两个部分:一个是实际的数据,另一个是长度信息。长度信息会被存储在记录头中,而实际的数据会被存储在记录的数据页中。 在InnoDB中,如果一个varchar类型的列的长度小于等于768个字节,那么它会被存储在记录的数据页中。如果一个varchar类型的列的长度超过了768个字节,那么它会被存储在单独的页中,并且在记录中只存储一个指向这个页的指针。 此外,由于InnoDB使用了行级锁定,每个记录都需要存储一个事务ID,用于实现MVCC(多版本并发控制)。因此,在InnoDB中,每个记录头还需要存储一个6字节的事务ID和一个2字节的回滚指针。 综上所述,当使用varchar类型时,需要注意其实际数据的长度和存储引擎的存储结构,以便更好地设计表结构和查询语句。 ### 回答2: MySQL的varchar存储结构确实是相当深奥的。在InnoDB存储引擎中,varchar类型的数据存储在表的记录中,其存储结构会影响数据写入、存储空间占用和查询性能。 首先,varchar类型的数据在记录中是以变长字符串的形式进行存储的。这意味着,varchar字段占用的存储空间与其实际存储的数据长度相关,而不是固定的。相比之下,固定长度的数据类型(如char)在存储时会占用固定的存储空间,无论实际数据的长度是多少。 其次,varchar类型的数据在记录中的存储格式是由一个表示长度的字节和真实字符串数据构成的。这个长度字段用于指示存储的实际数据的长度,使得数据库可以根据需要动态地分配存储空间,从而节省了存储空间。 此外,在InnoDB存储引擎中,varchar字段的数据存储在页内部的某个位置,而不是直接存储在页上。这是由于InnoDB采用了B+树的数据结构来组织数据,为了节省存储空间和提高数据访问效率,varchar字段的数据会被存储在叶子节点中。这样一来,在查询时可以更快地遍历和定位数据,提高查询性能。 综上所述,MySQL的varchar存储结构的深度体现在其变长存储方式、长度字段和数据存储位置等方面。了解和理解这些存储结构对于正确使用varchar类型的字段、优化存储空间和提高查询性能都是非常重要的。 ### 回答3: MySQL的varchar存储结构InnoDB引擎中确实是一个很深入的话题。InnoDB引擎是MySQL的默认引擎,它采用了B+树索引来存储数据。在InnoDB的记录存储结构中,varchar类型字段经过了一系列处理。 首先,InnoDB将每个记录分为固定长度部分和变长长度部分。varchar字段属于变长长度部分。对于varchar字段,MySQL会额外存储一个指针,指向数据存储区域。 其次,在实际存储varchar字段值时,InnoDB会使用两种方式。对于较短的varchar字段值,会直接将其存储在记录的数据域中。这样做的好处是可以减少额外的存储开销。 而对于较长的varchar字段值,InnoDB会将其存储在一个称为“Overflow Page”的额外存储空间中。Overflow Page的指针存储在记录的数据域中。Overflow Page与主记录有一个单独的物理连接。 另外,需要注意的是,在InnoDB中,varchar字段的长度是可变的,存储的最大长度由定义时的最大长度决定。这与char字段是不同的,char字段的长度是固定的。 总之,MySQL的varchar存储结构InnoDB引擎中是相对复杂的。它采用了不同的存储方式来处理不同长度的字段值,既保证了数据的存储效率,又满足了灵活性的要求。对于开发人员来说,了解varchar存储结构对于正确使用和优化数据库非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值