InnoDB存储引擎解析(一)

目录

一、MySQL底层架构

二、存储引擎解析(以Innobd为例)

2.1存储

2.1.1 数据存储位置 

2.1.2 数据存储结构

         2.1.3 一个页的存储结构


一、MySQL底层架构

InnoDB存储引擎解析(一)_第1张图片

连接器:管理连接,权限验证
查询缓存: MySQL8 .0以后已经删除该功能
分析器:词法分析和语法分析
优化器:执行计划生成,索引选择
执行器:操作引擎,返回结果
存储引擎:存储数据,提供读写接口

MySQL底层大体分为两部分,即客户端和服务端。

  • 客户端:SQLyog等SQL编辑器。
  • 服务端:分为Server和存储引擎两部分,两者之间通过接口调用。
    • Server层的作用是将客户端编写的sql字符串解析为一个可以执行的指令,具体可能包括先将SQL解析(语法解析和词法解析)生成一个语法树,再将语法树转变为可被执行的执行树,最后由优化器优化,得到最优的执行数最终执行。各部分具体功能如下:
    • 存储引擎的作用则主要为存储和检索。即将数据存储至硬盘,经检索后加载至内存,进行增删改查操作。



二、存储引擎解析(以Innobd为例



2.1存储

2.1.1 数据存储位置 

  • 单机下,打开自己的sql编辑器输入 SHOW GLOBAL VARIABLES LIKE '%datadir%'; 即可找到数据库对应的物理文件存放路径,如图:

  • 找到上述路径即可看到自己数据库对应物理存储文件,下图红框所示

InnoDB存储引擎解析(一)_第2张图片

  • 打开即可看到表对应的ibd文件,如下图。

InnoDB存储引擎解析(一)_第3张图片

存储引擎是InnoDB, 在data目录下会看到2类文件:.frm、.ibd
(1)*.frm–表结构的文件。

(2)*.ibd–表数据和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。

2.1.2 数据存储结构

  • innodb存储引擎在存储设计上模仿了Oracle的存储结构,其数据是按照表空间进行管理的。按照表->段->区->页->行的结构进行存储。

InnoDB存储引擎解析(一)_第4张图片

  • 表:新建一个数据库时,innodb存储引擎会初始化一个名为ibdata1 的表空间文件,每个表都对应一个.ibd文件。
  • 段:段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。
  • : 段是个逻辑概念,innodb引入了簇的概念,在代码中被称为extent; 簇是由64个连续的页组成的,每个页大小为16KB,即每个簇的大小为1MB。簇是构成段的基本元素,一个段由若干个簇构成。一个簇是物理上连续分配的一个段空间,每一个段至少会有一个簇,在创建一个段时会创建一个默认的簇。如果存储数据时,一个簇已经不足以放下更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是簇。
  • 页:页是数据库管理磁盘的最小单位,innodb存储引擎中默认每个页的大小为16kb,每次读取磁盘时都将页载入内存中。常见的页类型有:数据页(B-tree Node)。Undo页(Undo Log Page)。系统页(System Page)。事务数据页(Transaction system Page)。插入缓冲位图页(Insert Buffer Bitmap)等。
  • 行:对应表中的一行数据,主要分为头部、隐藏列(事务id、回滚id、索引id 这三个只有用到才进行创建)、数据列。

注意:一页至少存储两行数据。

行溢出问题

问题描述:一行有多个列,若某列大小超过16K,则造成行溢出。

解决:如果出现行溢出,则将溢出页的数据进行转移,寻找几个连续的页进行存储这些溢出数据,每个页存储一部分数据,并将第一个页的地址存储到溢出页的text/blob字段上。

2.1.3 一个页的存储结构

InnoDB存储引擎解析(一)_第5张图片

  • 页头:记录了上一页和下一页的信息(准确来说是文件头部),所以innodb页与页之间为双向。
  • 虚记录:通过最大最小虚记录可以确定该页存储的数据范围(可用于信息过滤)。
  • 记录堆、自由空间链表、未分配空间:存储行数据。
  • Slot区:优化业内查询效率。(相当于分组,Slot中记录了每个组的信息,相当于组长,进行查询时只需要偏离Slot区而不需要扫描全部数据,从而优化查询。要找班级里有没有这个人,只需要问一遍所有组长)
  • 页尾:校验页的完整性。


本笔记仅供学习之用,如有侵权,联系必删。


                                山再高,也在脚下;浪再大,也在船底。
 

你可能感兴趣的:(MySQL,mysql,面试,数据库,sql)