MySQL--表

索引组织表

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

    首先判断表中是否有非空的唯一索引,如果有,则该列即为主键。

    如果不符合上述条件,InnoDB 存储引擎自动创建一个 6 字节大小的指针(_rowid)。

  当表中有多个非空唯一索引时,InnoDB 存储引擎将选择建表时第一个定义的非空唯一索引为主键。这里需要注意的是,主键的选择根据的是定义索引的顺序,而不是建表时列的顺序。

InnoDB 逻辑存储结构

  从 InnoDB 存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个表空间中,称之为表空间。表空间又由段、区、页组成。页在一些文档中有时也称为块。

               

  表空间

    表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。

    如果启用了参数 innodb_file_per_table ,则每张表内的数据可以单独放到一个表空间内。

    每张表的表空间内存放的只是数据、索引和插入缓冲 Bitmap 页,其他类的数据,如回滚信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内。

  

    常见的段有数据段、索引段、回滚段等。

  

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

    InnoDB 1.2.x 版本新增了参数  innodb_page_size ,通过该参数可以将默认页的大小设为 4K,8K,但是页中的数据库不是压缩。

    不论页的大小怎么变化,区的大小总是 1M。

  

    页是 InnoDB 磁盘管理的最小单位。

    在 InnoDB 存储引擎中,默认每个页的大小是 16KB。从 InnoDB 1.2.x 版本开始,可以通过参数 innodb_page_size 将页的大小设置为 4K、8K、16K。若设置完成,则所有表中页的大小都为设置的值,不可以对其再次进行修改。除非通过 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)

  

    InnoDB 存储引擎是面向列的,也就是说数据是按行进行存放的。

    每个页存放的行记录是有硬性定义的,最多允许存放 16KB / 2 - 200 行的记录,即 7992 行记录。

InnoDB 行记录格式

  在 InnoDB 1.0.x 版本之前,InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录数据,这也是目前使用最多的一种格式。Redundant 格式是为了兼容之前版本而保留的。在 MySQL 5.1 版本中,默认设置为 Compact 行格式。

   show table status like 'table_name'; 查看当前表使用的行格式。

  Compact 行记录格式:

    Compact 行记录是在 MySQL 5.0 中引入的,其设计目标是高效地存储数据。简单来说,一个页中存放的行数据越多,其性能就越高。

  Redundant 行记录格式:

    Redundant 是 MySQL 5.0 版本之前 InnoDB 的行记录存储方式。

  行溢出数据:

    InnoDB 引擎可以将一条记录中的某些数据存储在真正的数据页面之外。

  Compressed 和 Dynamic 行记录格式:

    InnoDB 1.0.x 版本开始引入了新的文件格式,以前支持的 Compact 和 Redundant 格式称为 Antelope 文件格式,新的文件格式称为 Barracuda 格式。Barracuda 文件格式下拥有两种新的行记录格式:Compressed 和 Dynamic。新的两种记录格式对于存放的 BLOB 中的数据采用了完全的行溢出方式。

    Compressed 行记录格式的另一个功能就是,存储在其中的行数据会以 zlib 的算法进行压缩,因此对于 BLOB、TEXT、VARCHAR 这类大长度类型的数据能够进行非常有效的存储。

  CHAR 的行存储结构:

    在不同的字符集下,CHAR 类型列内部存储的可能不是定长的数据。

    InnoDB 存储引擎中,CHAR 类型被视为变长字符类型,对于未能沾满长度的字符还是填充 0x20。

InnoDB 数据页结构

  InnoDB 数据页由以下 7 个部分组成:

    File Header(文件头)

    Page Header(页头)

    Infimun 和 Supermum Records

    User Records(用户记录,即行记录)

    Free Space(空闲记录)

    Page Directory(页目录)

    File Trailer(文件结尾信息)

Named File Format 机制

  从 InnoDB 1.0.x 版本开始,InnoDB 存储引擎通过 Named File Format 机制来解决不同版本下页结构兼容性的问题。

   innodb_file_format 用来指定文件格式。

  

原文地址:https://www.cnblogs.com/microcat/p/7366003.html