• 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 用来指定文件格式。

      

  • 相关阅读:
    [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
    [珠玑之椟]二分思想与分治法、排序思想
    [珠玑之椟]浅谈代码正确性:循环不变式、断言、debug
    [珠玑之椟]随机数函数取样与概率
    逆序对:从插入排序到归并排序
    [珠玑之椟]估算的应用与Little定律
    [珠玑之椟]位向量/位图的定义和应用
    lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,
    Lua--------------------unity3D与Slua融合使用
    lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)
  • 原文地址:https://www.cnblogs.com/microcat/p/7366003.html
Copyright © 2020-2023  润新知