在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础 。
从InnoDB存储引擎的存储结构看,所有数据都被逻辑地放在一个空间中,称之为表空间(tablespace)、区(extent)、页(page)组成,页在一些文档中也被称之为块(block) 。
1、InnoDB逻辑存储结构InnoDB存储引擎的逻辑存储结构大致如图:

文章插图
这张图更清晰地展示了这些空间的包含关系:

文章插图
1.1、表空间(Tablespace)表空间可以看做InnoDB逻辑结构的最高层,所有的数据都放在表空间中 。
在默认情况下,InnoDB存储引擎都有一个共享表空间ibdata1,即所有数据都存放在这个表空间内 。如果用户启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内 。
如果启用了innodb_file_per_table参数,也需要注意,每张表的表空间存放的只是数据、索引和插入缓冲Bitmap页,其它类的数据,如回滚(undo)信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内 。
1.2、段(Segment)表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等 。
InnoDB存储引擎表是索引组织(index organized)的,因此数据即索引,索引即数据 。那么数据段即为B+树的叶子节点(Leaf node segment),索引段即为B+树的非索引节点(Non-leaf node segment),这些内容在后面的索引学习里会详细介绍 。
1.3、区(extend)区是由连续页组成的空间,在任何情况下每个区的大小都为1MB 。为了保证区中页的连续性,InonoDB存储引擎一次从磁盘申请4-5个区 。在默认情况下,InnoDB存储引擎的页的大小为16KB,即一个区中应有64个连续的页 。
InnoDB1.0.x版本开始引入压缩页,每个页的大小可以通过参数KEY_BLOCK_SIZE设置为2K、4K、8K,因此每个区对应的页尾512、256、128.
InnoDB1.2.x版本新增了参数innodb_page_size,通过该参数可以将默认页的大小设置为4K、8K,但是页中的数据不是压缩的 。
但是有时候为了节约磁盘容量的开销,创建表默认大小是96KB,区中是64个连续的页 。(对于一些小表)
1.4、页(page)页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB;InnoDB存储引擎从1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K 。
若设置完成,则所有表中页的大小都为innodb_page_size,不可以再次对其进行修改,除非通过MySQLdump导入和导出操作来产生新的库 。
innoDB存储引擎中,常见的页类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页 (System Page)
- 事务数据页 (Transaction System Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页 (compressed BLOB Page)
2、InnoDB 行记录格式InnoDB 存储引擎和大多数数据库一样(如 Oracle 和 Microsoft SQL Server 数据库),记录是以行的形式存储的 。这意味着页中保存着表中一行行的数据 。在 InnoDB 1.0x 版本之前,InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录数据,这也是目前使用最多的一种格式 。
2.1、Compact 行记录格式Compact 行记录是在 MySQL 5.0 中引人的,其设计目标是髙效地存储数据 。简单来说,一个页中存放的行数据越多,其性能就越髙 。
下图显示了 Compact 行记录的存储方式:

文章插图
Compact 行记录格式的首部是一个非 NULL 变长字段长度列表,并且其是按照列的顺序逆序放置的,其长度为:
- 若列的长度小于 255 字节,用 1 字节表示;
- 若大于 255 个字节,用2 字节表示 。
推荐阅读
- MYSQL5.7安装教程
- MySQL 5.6.28修改root用户密码(windows)
- App反爬虫 Python高级反爬虫类型
- MySQL深度分页:数千万的数据如何快速分页?
- 爆破SSH/MySQL账户竟如此简单
- CentOS7下MySQL数据库服务器的安装和配置
- 看了这篇MySQL,开发功力又升级
- mysql导入导出命令
- MySQL Explain详解,添加索引sql优化
- Mysql建立、删除索引及使用
