上节,介绍的是在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:索引段、数据段
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页装的行记录数量尽可能多,提高查询性能。
Comments | NOTHING