第07章_InnoDB数据存储结构

  • 1.数据库的存储结构:页
    • 1.1磁盘与内存交互基本单位:页
    • 1.2页结构概述
    • 1.3页的大小
    • 1.4页的上层结构
  • 2.页的内部结构
    • 第1部分:File Header(文件头部)和File Trailer (文件尾部)

说明:本内容整理自尚硅谷B站MySQL视频>>尚硅谷B站MySQL视频

1.数据库的存储结构:页

索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎比如Memory都不用磁盘来存储数据。
由于InnoDB是MySQL的默认存储引擎,所以本章剖析InnoDB存储引擎的数据存储结构。

1.1磁盘与内存交互基本单位:页

InnoDB将数据划分为若干个页,InnoDB中页的大小默认为 16KB
以页作为磁盘和内存之间交互的基本单位,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。也就是说,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页(Page),数据库I/O操作的最小单位是页。一个页中可以存储多个行记录

记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次I/O操作)只能处理一行数据,效率会非常低。

1.2页结构概述

页a、页b、页c …页n这些页可以不在物理结构上相连,只要通过双向链表相关联即可。每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。

1.3页的大小

不同的数据库管理系统(简称DBMS)的页大小不同。比如在MySQL的InnoDB存储引擎中,默认页的大小是16KB,可以通过下面的命令来进行查看:

show variables like '%innodb_page_size%';
/*
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
*/

SQL Server中页的大小为 8KB,而在oracle中用术语’‘块’’(Block)来代表"页”,Oralce支持的块大小为2KB,4KB,8KB,16K8,32KB和64KB。

1.4页的上层结构

另外在数据库中,还存在区(Extent)、段(Segment)和表空间(Tablespace)的概念。行、页、区、段、表空间的关系如下图所示:

区(Extent)是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64个连续的页。因为InnoDB中的页大小默认是16KB,所以一个区的大小是64*16KB= 1MB。
段(Segment)由一个或多个区组成,区在文件系统是一个连续分配的空间(在InnoDB中是连续的64个页),不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当创建数据表、索引的时候,就会相应创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。
表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间,用户表空间、撤销表空间、临时表空间等。

2.页的内部结构

页如果按类型划分的话,常见的有数据页(保存B+树节点)、系统页、Undo页和事务数据页等。数据页是我们最常使用的页。
数据页的16KB大小的存储空间被划分为七个部分,分别是文件头(File Header)、页头(Page Header)、最大最小记录(Infimum+supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)和文件尾(File Tailer) .
页结构的示意图如下所示:

这7个部分作用分别如下,简单梳理如下表所示:

名称 占用大小 说明
File Header 38字节 文件头,描述页的信息
Page Header 56字节 页头,页的状态信息
lnfimum-Supremum 26字节 最大和最小记录,这是两个虚拟的行记录
User Records 不确定 用户记录,存储行记录内容
Free Space 不确定 空闲记录,页中还没有被使用的空间
Page Directory 不确定 页目录,存储用户记录的相对位置
File Trailer 8字节 文件尾,校验页是否完整

我们可以把这7个结构分成3个部分

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

首先是文件通用部分,也就是文件头和文件尾。
文件头部信息
不同类型的页都会以File Header作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁等,所有的数据页会组成一个双领衣。这个部分占用固定的no个当世R山下i力立比山方4日Lhh白:

Compact行格式会把可以为NULL的列统一管理起来,存在一个标记为NULL值列表中。如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。
为什么定义NULL值列表?
之所以要存储NULL是因为数据都是需要对齐的,如果没有标注出来NULL值的位置,就有可能在查询数据的时候出现混乱。如果使用一个特定的符号放到相应的数据位表示空置的话,虽然能达到效果,但是这样很浪费空间,所以直接就在行数据得头部开辟出一块空间专门用来记录该行数据哪些是非空数据,哪些是空数据,格式如下:

  1. 二进制位的值为1时,代表该列的值为NULL。
  2. 二进制位的值为0时,代表该列的值不为NULL。
    例如:字段 a、b、c,其中a是主键,在某一行中存储的数依次是 a=1、b=null、c=2。那么Compact行格式中的NULL值列表中存储:01。第一个0表示c不为null,第二个1表示b是null。这里之所以没有a是因为数据库会自动跳过主键,因为主键肯定是非NULL且唯一的,在NULL值列表的数据中就会自动跳过主键。
    record_test_table的两条记录的NULL值列表就如下:
    第一条记录:

第二条记录:

说明:本内容整理自尚硅谷B站MySQL视频>>尚硅谷B站MySQL视频

MySQL笔记:第07章_InnoDB数据存储结构相关推荐

  1. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第六章:数据存储

    第 6 章 数据存储 本章介绍Android 4种存储方式的用法,包括共享参数SharedPreferences.数据库SQLite.存储卡文 件.App的全局内存,另外介绍Android重要组件-应 ...

  2. 《Python网络爬虫——从入门到实践》第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法)

    <Python网络爬虫--从入门到实践>第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法) 作为刚开始入门python的小白,对大数据,网络爬虫比较感兴趣.完全是自我修炼 ...

  3. 【mysql】-【innodb数据存储结构】

    文章目录 数据库的存储结构:页 磁盘与内存交互基本单位:页 页结构概述 页的大小 页的上层结构 页的内部结构 File Header(文件头部)和File Trailer(文件尾部) File Hea ...

  4. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  5. (八)InnoDB数据存储结构

    InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...

  6. InnoDB数据存储结构

    数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中.另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中 ...

  7. 【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析

    目录 一.MySQL架构图 二.InnoDB数据页结构 2.1 局部性原理 2.2 InnoDB的数据页格式 三.InnoDB的行格式 3.1 Compact行格式 3.1.1 变长字段长度列表 3. ...

  8. elasticsearch数据存储结构,springboot集成elasticsearch

    一.数据存储结构 结合数据库的结构理解起来就会比较清楚: 1)索引(Index)=>数据库(Database). 2)类型(Type)=>表(Table). 3)文档(Document)= ...

  9. Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

最新文章

  1. ASP.Net网站开发的单元测试方案
  2. UIPickerView隐藏透明条
  3. Luffy之Xadmin以及首页搭建(轮播图,导航)
  4. 华为畅享9s可以升级鸿蒙吗,珍珠全面屏!华为畅享9S/9e正式发布:千元三摄加持...
  5. 双十一!!作为程序员的你该如何拥有个人服务器和域名呢?
  6. Linux中设置tab4个空格,linux下vim中tab设置为4个空格例子
  7. 买SUV要不要选四驱,有哪些区别?
  8. 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
  9. PAT-1068 万绿丛中一点红
  10. python如何计算平均分_python脚本如何输入成绩求平均分?
  11. 台式机win10系统能连接上wifi,但是不能上网,终于解决了
  12. ios10怎么设置电池颜色_苹果手机电池颜色变黄了怎么调
  13. 基于大数据的能力开放平台解决方案
  14. 云运维拓扑图_云运维的核心是什么?
  15. 浪潮之巅第一章 — 帝国的余辉(ATT)
  16. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
  17. eb8000软件怎样上传_EB8000程序上传与下载
  18. DL:测试鸢尾花数据回归分析
  19. 外汇天眼:投资200美元起 每天收益7%!千万别被蒙蔽双眼!
  20. 希望开复老师早日康复

热门文章

  1. Excel如何刷新模型
  2. MEMS mic之IIS mic(三)
  3. js entries()
  4. 水火既济:百尺竿头;火水未济:更进一步
  5. MSP430Ware使用笔记 初始化DCO至8MHz
  6. [转载]Alsa驱动分析
  7. shell脚本一百例
  8. 停止不必要的UI动效设计
  9. master公式(主方法)
  10. PyTorch主要组成模块 | 数据读入 | 数据预处理 | 模型构建 | 模型初始化 | 损失函数 | 优化器 | 训练与评估