4.4 InnoDB的物理存储结构:5层



上节,介绍的是在InnoDB中的数据表,B+树这个数据结构的具体实现。

本节,介绍InnoDB的数据表,是怎么物理存储的,落盘。

一、本章内容

介绍

  • InnoDB的逻辑存储结构
  • InnoDB的行记录格式进化之路(了解)

二、InnoDB的逻辑存储结构

以下,均是InnoDB在磁盘存储上的概念。

2.1 5个层次(图)

  • 表空间:即ibd文件
  • 表空间里有段
  • 段里有区
  • 一个区有8X8=64个Page(跟上章B+树中的一个节点也叫Page,呼应)
  • 一个页里,存储了很多数据,比如上下限指针、Row。其实Row里面的Col才是真正的行数据

2.2 表空间 tablespace:即磁盘上的ibd文件

数据表和数据,最终是落在磁盘上的ibd文件,即表空间。

推荐设置为独占表空间,因为崩溃、救援时,会很方便。

2.3 段 segment:索引段、数据段

B+树分为以下几段:

2.4 区 extent

一个区,有64个Page页。每个页,默认是16KB。

所以,一个区,默认就是:64*16KB=1024KB=1M

一个页,本质就是一个B+树的节点。

所以,ibd文件,每次增长至少是4-5M。

2.5 页 page、行 row

  • InnoDB这个引擎的磁盘读写最小逻辑单元是16KB,是各类硬盘最小读写单元的倍数,确保磁盘读写高效、不浪费
  • 行 ,就是数据真正存储的地方

2.6 注意

有可能,B+树的表结构,跟物理存储结构(连续,但邻居可能是没关系的),是不一样的。

通过指针,这样后者就能转换为前者。

2.7 小结

2.8 思考题

不能太大。原因是:

(1)页,过大,对磁盘的读写,压力巨大。

因为页,是InnoDB读写磁盘的最小单位。

最终导致,内存浪费很多。因为有可能读取硬盘16M到内存,只是需要1条行数据。

(2)页里面是链表,线性查询,太慢。

不能太小。原因是:

因为,磁盘,不管是机械磁盘,还是SSD,最小读写单位也比较大,512B、4K。

如果是一个页太小,比如16B,要么是不能完整的用满磁盘的一个最小读写单元。

综上所述,一个页的大小,默认就是16KB。

三、InnoDB的行记录格式

行记录,即InnoDB的逻辑存储结构中的最低的那个层次。

3.1 InnoDB的变长列

变长列:就是长度可以改变的列。

这里的长度:是指磁盘的存储空间的长度,还是字符串的长度?前者。

VAR

variable : )

3.2 行溢出数据

1.

假如,一个页就存储一个行记录。这个行记录是不能无限变长的。

比如,一个行记录是VARCHAR,65535,存一本《倚天屠龙记》,绝对超过页的16K了。

一次磁盘的IO,开销是很大的。

2.所以,应该控制行记录的大小。

如下,如果1个节点过大,以至于1个节点就只能存放着1条数据。那么就会退化为平衡二叉树AVL,效率下降。

解决措施:给那个超长的行记录瘦身,把大块头放到另外的blog页中。这样一个页就总能存放很多条的行记录。以维持B+树的形态。

因为每次取数据,并不是一定会取那个超长的行Col1,即不是每次查询都是SELECT *,而只是查询某些字段。基于这个假设,进行了这个优化。

3.3 InnoDB的行记录格式 Row Format

数据库中,一行记录,在磁盘上具体的物理存储是什么样的。

  • 上面:老的,现在基本不用
  • 下面:现在用的最多的是,Dynamic

1.Redundant:冗余

2.Compact

技术就是这样的,每次改进就是一小点。

3.Dynamic

4.Compressed

3.4 小结

上述进化的核心:节约每个行记录的占用空间,让一个page页装的行记录数量尽可能多,提高查询性能。

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 4.4 InnoDB的物理存储结构:5层


Follow excellence, and success will chase you.