美文网首页
Mysql InnoDB行格式、数据页结构

Mysql InnoDB行格式、数据页结构

作者: 皮儿吃屁 | 来源:发表于2020-07-27 11:48 被阅读0次

    InnoDB存储引擎

    从Mysql5.5版本开始,InnoDB是默认的表存储引擎。其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。

    InnoDB读取数据的方式

    将数据划分为若干页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般是16KB,当需要从磁盘中读取数据时每一次最少将从磁盘中读取16KB的内容到内存中,每一次最少也会把内存中的16KB内容写到磁盘中。

    InnoDB行格式

    一行记录可以以不同的格式存在InnoDB,行格式分别是Compact(紧凑)、Redundant(冗余)、Dynamic(动态)和Compressed(压缩)行格式;

    compact行格式

    变长字段长度列表:

    MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型,这些数据类型修饰列称为变长字段,变长字段中存储多少字节的数据不是固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表。varchar(M) M代表最大能存储多少个字符,mysql5之前是字节;

    NULL值列表

    compact行格式会把可能为NULL的列(不设NOT NULL的列)统一管理起来,存一个标记为NULL值列表中,如果表中没有允许存储NULL值,则NULL值列表也不存在了;当二进制为1时,表示该列为NULL,若为0则表示不为NULL;也就是在NULL值列表中存可能为NULL的列,如果该列为null则对应1;如果该列不为null则是0;

    记录中的数据太多产生的溢出

    一个页的大小为16384字节,而一个varchar类型的列最多可以存储65535个字节,这样就导致一个页存放不下一个记录。在compact和redundant行格式中,对于占用存储空间非常大的列,在记录的真实数据只会存储该列的一部分数据,把剩余的数据分散存储在其他页中,然后记录的真实数据处用20个字节存储指向这些页的地址,字节中还包含这列其他的这些页面中的数据占用的字节数,从而可以找到剩余数据所在页。

    Dynamic和Compressed行格式

    类似于Compact行格式,只不过在处理行溢出数据时有点分歧,它们不会在记录真实数据处存储一部分数据,而是把所有数据都存储在其他页面中,只在记录真实数据处存储其他页面的地址。另外,Compressed行格式会采用压缩算法对页面进行压缩。

    数据页结构的快速浏览

    页的本质就是一块16KB大小的存储空间,InnoDB为了不同的目的而把页分为不同的类型,其中用于存放记录的页也称为数据页,我们先看看这个用于存放记录的页长什么样。数据页代表的这块16KB大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:

    数据页结构描述

    更多参考:https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483678&idx=1&sn=913780d42e7a81fd3f9b74

    相关文章

      网友评论

          本文标题:Mysql InnoDB行格式、数据页结构

          本文链接:https://www.haomeiwen.com/subject/rmctlktx.html