索引组织表
Innodb存储引擎中所有的数据都是根据索引的顺序来存放的,这种结构就是索引组织表,当创建表的时候如果没有声明主键索引,就看有没有声明唯一索引,如有有就将该列列为主键,如果也没有生命唯一索引,就会自动创建一个6字节大小的指针
InnoDb存储数据结构
所有数据都被逻辑存在一个空间中叫做表空间,表空间由段,区,页组成,页在一些文档中又被称作为块
- 表空间
是逻辑结构的最高层,所有数据都被存储在这里
- 段
表空间由多个段组成,段中又包含数据段,索引段,回滚段,其中数据段就是B+树的叶子节点,索引段就是B+树的非叶子节点
- 区
区是连续页的组成的空间,在任何清空下区的大小都是1M,默认情况下Innodb存储引擎页的大小为16kb,即一个区一共有64个连续的页,Innodb在后期的版本里面引入了压缩页,一页可能只有9k,但是无论页大小是多少,一个区都是1M
页
页是磁盘管理的最小单位,默认一个页大小是16kb,常见的页类型有
-
- 数据页
- undo页
- 系统页
- 事务处理页
- 插入缓冲位图页
- 插入缓冲空闲列表页
Innodb存储引擎是面向列的,数据是按照行进行存放的,页中存放的都是一行一行的数据,引擎提供了两种格式来存放航记录,Compact
和Redundant
这里要说以下varchar这个类型,oracle的varchar2最大可存放4000字节,mysql的varchar最大可存放65535字节,但我们知道,一个页是16kb,也就是最多应该是16384字节,那是怎么存储65535字节的呢,是因为一般情况下innodb的数据都是存在页类型为B-tree node中,但是发生行溢出数据时,数据存放的页类型是Uncompress BLOB页
另外我们定义的varchar(N)
这个长度实际上是字符的长度,而不是字节数。
而且65535其实是一行列的字节总数不能超过这个值。当发生行溢出时,虽然我们创建的是varchar,但是最终innodb会把varchar类型转换成text类型来存放