• InnoDB的逻辑存储结构是什么,表空间组成包括哪些?


    一、表空间

    在InnoDB中我们创建的表还有对应的索引数据都存储在扩展名为.ibd 的文件中,这个文件路径可以先通过查mysql变量datadir来得到,然后进入对应的数据库名目录,会看到很多ibd,文件名就是表名,这里有两种类型的表空间,共享表空间(或者叫系统表空间)和独立表空间文件。

    对于共享表空间,所有的表数据和相应索引都存放在这里,而独立表空间,就是每个表的数据和索引都存放在一个单独的ibd文件中,在目前的MySQL版本中,默认都是使用的独立表空间。

    共享表空间文件名可以通过innodb_data_file_path得到,

    1
    2
    3
    4
    5
    6
    7
    mysql> show variables like 'innodb_data_file_path';
    +-----------------------+------------------------+
    | Variable_name         | Value                  |
    +-----------------------+------------------------+
    | innodb_data_file_path | ibdata1:12M:autoextend |
    +-----------------------+------------------------+
    1 row in set (0.00 sec)

     

    独立和共享表空间可以通过innodb_file_per_table切换,如果启用了他,那么每张表内的数据就单独放在一个表空间文件中,还需要注意,每个表的表空间只存储数据、索引,其他类的数据,如回滚信息、系统事务信息、二次写缓冲仍存储在原始共享表空间中。

    下面语句可以查看innodb_file_per_table的状态。

    1
    2
    3
    4
    5
    6
    7
    mysql> show variables like '%innodb_file_per_table';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_file_per_table | ON    |
    +-----------------------+-------+
    1 row in set (0.01 sec)

     

    修改innodb_file_per_table状态

    1
    set global innodb_file_per_table=0;

      

    如果在innodb_file_per_table等于0的情况下,也就是OFF关闭情况下,创建的表都会存放的系统共享的表空间中,比如下面的列子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    1.创建database_1数据库
    mysql> create  database database_1;
    Query OK, 1 row affected (0.02 sec)
     
    2. 当前状态
    mysql> show variables like '%innodb_file_per_table';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_file_per_table | ON    |
    +-----------------------+-------+
    1 row in set (0.01 sec)
     
    3. 创建表
    mysql> create table t1(id int(11));
    Query OK, 0 rows affected, 1 warning (0.05 sec)
     
     
    4. 查看ibd文件
    root@hxl-PC:/var/lib/mysql/database_1# ls
    t1.ibd
    root@hxl-PC:/var/lib/mysql/database_1#
     
    5. 关闭innodb_file_per_table后在创建表
    mysql> set global innodb_file_per_table=0;
    Query OK, 0 rows affected (0.01 sec)
     
    mysql> create table t2(id int(11));
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    6. 查看ibd文件
    root@hxl-PC:/var/lib/mysql/database_1# ls
    t1.ibd

     

    可以发现在关闭后,没有创建新的ibd文件。

    表空间又由段(segment)、区(extent)、页(page)组成,引入一张网络图片。

    image.png

    二、段

    表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由N个区和32个零散的页组成。

    InnoDB默认是基于B+树实现的数据存储。这里的索引段则是指的B+树的非叶子节点,而数据段则是B+树的叶子节点。而回滚段则指的是回滚数据,事务隔离的MVCC利用了回滚段实现了多版本查询数据。

     

    三、区

    区是由连续的页组成的空间,无论如何,每个区的大小都是1MB。为了保证区域内页面的连续性,InnoDB存储引擎一次从磁盘申请4-5个区域。

     

     

    四、页

    页是InnoDB存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size设置页大小为4K、8K、16K 。

    默认情况下,InnoDB存储引擎的区大小为1MB,也就是有64个连续页组成,即16*64=1024=1M。

    InnoDB为了实现不同的目的而设计了很多种页,InnoDB 存储引擎中常见的页面类型有:

    1. 数据页

    2. undo页面

    3. 系统页面

    4. 事物数据页面(交易系统页面)

    5. 插入缓冲位图页

    6. 插入缓冲区空闲列表页

    7. 未压缩的二进制大对象页面

    8. 压缩二进制大对象页面

    可以通过以下命令查看大小。

    1
    2
    3
    4
    5
    6
    7
    mysql> show status like 'innodb_page_size';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | Innodb_page_size | 16384 |
    +------------------+-------+
    1 row in set (0.00 sec)

      

    下面是InnoDB数据页结构,它由七部分组成。

    image.png

    名称作用
    File header 记录了页头的一些信息,cheksum、Ppervious和next page的记录
    Page header 记录了页的状态信息和存储信息、首个记录的position
    Infimum+ supremum InnoDB每个数据页有两个虚拟行记录,用来限定记录边界
    Row records 实际存储的行数据信息
    Free space 空闲空间,同样是链表结构
    Page directory 存放了记录的相对位置
    File trailer innodb利用它来保证页完整地写入磁盘

     

    五、行

    InnoDB存储引擎是面向行的,页里面又记录着行记录的信息,也就是数据是按照行存储的。行记录数据又是按照行格式进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200行,也就是7992行。

    InnoDB存储引擎有两种文件格式,一种叫Antelops,另外一种叫Barracuda。

    在Antelope文件格式下,有compact和redundant两种行记录格式。

    在Barracuda文件格式下,有compressed和dynamic两种行记录格式。

    可以通过以下方式查看当前格式,其中Row_format就是对应行格式存储类型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    mysql> show table status \G;
    *************************** 1. row ***************************
               Name: t1
             Engine: InnoDB
            Version: 10
         Row_format: Dynamic
               Rows: 15
     Avg_row_length: 1092
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2021-08-24 09:43:29
        Update_time: 2021-08-24 14:43:35
         Check_time: NULL
          Collation: utf8mb4_0900_ai_ci
           Checksum: NULL
     Create_options:
            Comment:

     

     

    文章资料:

    1. https://www.cnblogs.com/agilestyle/p/11428574.html
    2. https://juejin.cn/post/6999936914119720996
    3. https://time.geekbang.org/column/article/121710 

     

  • 相关阅读:
    如何降低海康、大华等网络摄像头调用的高延迟问题(一):海康威视网络摄像头的python sdk使用(opencv读取sdk流)
    面试小计_TX
    java源码用到的设计模式
    tensorflow fashion_mnist数据集模型训练及预测
    基于遗传算法的PID控制器增益的实现(Matlab代码实现)
    (自我介绍范文)java面试自我介绍
    AcWing 505. 火柴排队(每日一题)
    iPhone15拉胯,国产手机用折叠屏大反攻!
    go的singleFlight学习
    CDH大数据平台 31Cloudera Manager Console之impala hive负载均衡(markdown新版)
  • 原文地址:https://www.cnblogs.com/xuxh120/p/16216151.html