澳门在线威尼斯官方 > 电脑数据库 > 【威尼斯澳门在线】InnoDB引擎逻辑存储结构,索

原标题:【威尼斯澳门在线】InnoDB引擎逻辑存储结构,索

浏览次数:96 时间:2019-12-12

本文由  网易云发布。

(本片博文是《MySQL技术内幕 InnoDB存储引擎第二版》的读书笔记)

 

索引组织表

InnoDB存储引擎中,表都是按照主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。InnoDB存储引擎表中,每张表都有个主键,若在创建表时没有显式定义主键则InnoDB存储引擎会按如下方式选择或者创建主键:

  • 首先判断表中是否有非空的唯一索引(Unique NOT NULL),如果有,则该列即为主键。(当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键,注意是根据定义索引的顺序而不是建表时列的顺序)。
  • 如果不符上述条件,则会自动创建一个6字节大小的指针。

作者:范鹏程,网易考拉海购

InnoDB逻辑存储结构

这是《MySQL技术内幕 InnoDB存储引擎》一书中对InnoDB逻辑存储结构的描述。

威尼斯澳门在线 1

1.PNG

InnoDB是 MySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索。以下是我对最近学习的知识的一些总结,以及对碰到的以及别人提到过的问题的一些分析,如有错误,请指正,我会及时更正。

表空间

表空间是Innodb存储引擎逻辑的最高层,所有的数据都存放在表空间中,默认情况下,Innodb存储引擎有一个共享表空间ibdata1,即所有数据都存放在这个表空间中内。如果启用了innodb_file_per_table参数,则每张表内的数据可以单独放到一个表空间内,但请注意,只有数据、索引、和插入缓冲Bitmap放入单独表内,其他数据,比如回滚(undo)信息、插入缓冲检索页、系统事物信息,二次写缓冲等还是放在原来的共享表内的。

目录

InnoDB表结构

B树与B+树

聚簇索引和二级索引

SQL执行顺序

SQL优化建议

一些问题分析

参考资料

从上图中可以看出表空间由段组成,常见的段有数据段、索引段、回滚段等。因为InnoDB存储引擎表是索引组织的,因此数据即索引,索引即数据。数据段即为B+树的叶子结点,索引段即为B+树的非索引结点。在InnoDB存储引擎中对段的管理都是由引擎自身所完成,DBA不能也没必要对其进行控制。

1. InnoDB表结构

此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。

1.1 InnoDB逻辑存储结构

MySQL表中的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment)、区(extent)、页(page)、行(row),逻辑结构如下图:

威尼斯澳门在线 2

  • 段(segment)

表空间是由不同的段组成的,常见的段有:数据段,索引段,回滚段等等,在 MySQL中,数据是按照B+树来存储,因此数据即索引,因此数据段即为B+树的叶子节点,索引段为B+树的非叶子节点,回滚段用于存储undo日志,用于事务失败后数据回滚以及在事务未提交之前通过undo日志获取之前版本的数据,在InnoDB1.1版本之前一个InnoDB,只支持一个回滚段,支持1023个并发修改事务同时进行,在InnoDB1.2版本,将回滚段数量提高到了128个,也就是说可以同时进行128*1023个并发修改事务。

  • 区(extent)

区是由连续页组成的空间,每个区的固定大小为1MB,为保证区中页的连续性,InnoDB会一次从磁盘中申请4~5个区,在默认不压缩的情况下,一个区可以容纳64个连续的页。但是在开始新建表的时候,空表的默认大小为96KB,是由于为了高效的利用磁盘空间,在开始插入数据时表会先利用32个页大小的碎片页来存储数据,当这些碎片使用完后,表大小才会按照MB倍数来增加。

  • 页(page)

页是InnoDB存储引擎的最小管理单位,每页大小默认是16KB,从InnoDB 1.2.x版本开始,可以利用innodb_page_size来改变页size,但是改变只能在初始化InnoDB实例前进行修改,之后便无法进行修改,除非mysqldump导出创建新库,常见的页类型有:数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。

  • 行(row)

行对应的是表中的行记录,每页存储最多的行记录也是有硬性规定的最多16KB/2-200,即7992行(16KB是页大小,我也不明白为什么要这么算,据说是内核定义)

1.2 InnoDB行记录格式

InnoDB提供了两种格式来存储行记录:Redundant格式、Compact格式、Dynamic格式、Compressed格式,Redudant格式是为了兼容保留的。

Redundant行格式(5.0版本之前的格式)

威尼斯澳门在线 3

  • 字段长度偏移列表:存储字段偏移量,与列字段顺序相反存放,若列长度小于255字节,用一个字节表示,若大于255字节,用两个字节表示
  • 记录头信息:固定用6字节表示,具体含义如下:

威尼斯澳门在线 4

隐藏列:事务id和回滚列id,分别占用6、7字节,若此表没有主键,还会增加6字节的rowid列。

Compact行格式(5.6版本的默认行格式)

威尼斯澳门在线 5

  • 变长字段长度列表:此字段标识列字段的长度,与列字段顺序相反存放,若列长度小于255字节,用一个字节表示,若大于255字节,用两个字节表示,这也是 MySQL的VARCHAR类型最大长度限制为65535
  • NULL标志位:标识改列是否有空字段,有用1表示,否则为0,该标志位长度为ceil(N/8)(此处是 MySQL技术内幕-InnoDB存储引擎与官方文档有出入的地方);
  • 记录头信息:固定用5字节表示,具体含义如下:

威尼斯澳门在线 6

  • 列数据:此行存储着列字段数据,Null是不占存储空间的;
  • 隐藏列:事务id和回滚列id,分别占用6、7字节,若此表没有主键,还会增加6字节的rowid列。

Note: 关于行溢出,即Redundant格式、Compact格式存储很长的字符串,在该字段会存储该字符串的前768个字节的前缀(字段超过768字节则为变长字段),并将整个字符串存储在uncompress blob页中。

Dynamic格式(5.7版本默认行格式)和Compressed格式

Dynamic格式和Compressed格式与Compact的不同之处在于对于行溢出只会在该列处存放20字节的指针,指向该字符串的实际存储位置,不会存储768字节前缀,而且Compressed格式在存储BLOB、TEXT、VARCHAR等类型会利用zlib算法进行压缩,能够以很高的存储效率来存储字符串。

1.3 InnoDB数据页结构

《 MySQL技术内幕-InnoDB存储引擎》书中对此有描述,但是应该不是太准确,书中有如下描述,此处不做详细介绍,若有兴趣请看此神书。

威尼斯澳门在线 7

区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区。默认情况下,InnoDB存储引擎页的大小为16KB,一个区中一共64个连续的区。

本文由澳门在线威尼斯官方发布于电脑数据库,转载请注明出处:【威尼斯澳门在线】InnoDB引擎逻辑存储结构,索

关键词:

上一篇:【威尼斯澳门在线】已提交到MariaDB官方手册

下一篇:已提交到MariaDB官方手册