当前位置: 首页 > news >正文

MYSQL 四、mysql进阶 5(InnoDB数据存储结构)

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

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

        由于InnoDB是mysql的默认存储引擎,所以下面主要讲解的是InnoDB存储引擎的数据存储结构。

        

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

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

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

   
        1.2页结构概述

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

        1.3 页的大小

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

show variables like '%innodb_page_size%' 

      SQL Server 中页的大小为 8KB,而在 Oracle 中我们用术语 "" (Block)来表示 "页",Oracle 支持的快大小为2KB, 4KB, 8KB, 16KB, 32KB 和 64KB。

        1.4 页的上层结构

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

         

        二、页的内部结构

        页如果按照类型划分的话,常见的有数据页(保存B+数节点)、系统页、Undo页和事务数据页等。数据页是我们最常用的页。

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

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

        这七个部分作用分别如下:
              

        我们可以把这个7个结构分成3个部分:
        第一部分:File Header(文件头部)和 FileTrailer(文件尾部) 
        首先文件通用部分,也就是文件头和文件尾。

        1、文件头信息
        不同类型的页都会以File Header作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页,下一个页是谁等,所有的数据页组成一个双链表,这个部分占用固定的

 

http://www.lryc.cn/news/388293.html

相关文章:

  • Spring企业开发核心框架-下
  • X射线底片焊缝缺陷检测
  • 直播的js代码debug解析找到protobuf消息的定义
  • 详细学习es6扩展运算符
  • HEC-HMS水文模型教程
  • Spring Cloud LoadBalancer基础入门与应用实践
  • layui在表格中嵌入上传按钮,并修改上传进度条
  • 14-10 AIGC 项目生命周期——第一阶段
  • 经典小游戏(一)C实现——三子棋
  • 如何利用AI生成可视化图表(统计图、流程图、思维导图……)免代码一键绘制图表
  • Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)
  • ubuntu 18 虚拟机安装(1)
  • Github 上 Star 数最多的大模型应用基础服务 Dify 深度解读(一)
  • XStream导出xml文件
  • 陪诊小程序搭建:构建便捷医疗陪诊服务的创新实践
  • 0139__TCP协议
  • 家政小程序的开发,带动市场快速发展,提高家政服务质量
  • JavaScript高级程序设计(第四版)--学习记录之对象、类与面向对象编程(下)
  • PDF 生成(5)— 内容页支持由多页面组成
  • day 51 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
  • http包详解
  • Reqable实战系列:Flutter移动应用抓包调试教程
  • 乾元通渠道商中标吴忠市自然灾害应急能力提升项目
  • 护网蓝队面试
  • 【高考志愿】金融学
  • 返利App的用户行为分析与数据驱动决策
  • python基础:高级数据类型:集合
  • idk17配置
  • Java实现日志全链路追踪.精确到一次请求的全部流程
  • 你敢相信吗,AI绘画正在逐渐取代你的工作!