一、表空间

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

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

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

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

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

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

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

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

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

二、段

表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由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. mysql> show status like 'innodb_page_size';
  2. +------------------+-------+
  3. | Variable_name | Value |
  4. +------------------+-------+
  5. | Innodb_page_size | 16384 |
  6. +------------------+-------+
  7. 1 row in set (0.00 sec)

  

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

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

 

文章资料:

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

InnoDB的逻辑存储结构是什么,表空间组成包括哪些?的更多相关文章

  1. mysql innodb 的 逻辑存储结构

    如上图: innodb 的 逻辑存储单元分成 表空间,段,区,页 4个等级 默认情况下,一个数据库 所有变共享一个 默认的表空间(tablespan).可以指定每个表一个表空间. 一个表空间管理着 多 ...

  2. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  3. InnoDB存储引擎表的逻辑存储结构

    1.索引组织表:     在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则Inn ...

  4. InnoDB 逻辑存储结构

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/80 如果创建表时没有显示的定义主键,mysql会按如下方式创建主 ...

  5. MySQL InnoDB 逻辑存储结构

    MySQL InnoDB 逻辑存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment).区(extent).页(page)组成.p ...

  6. MYSQL Innodb逻辑存储结构

    转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ...

  7. InnoDB逻辑存储结构

    从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace).表空间又由段(segment).区(extent).页(page)组成.页在一些文档中 ...

  8. oracle逻辑存储结构

    oracle数据库管理系统有三个重要的概念:实例.数据库.数据库服务器.oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构.逻辑存储结构用于描绘Oracle内部组织和管理数据的方式,而物理 ...

  9. Oracle 逻辑存储结构

    一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...

随机推荐

  1. 什么是 Spring Cloud Bus?我们需要它吗?

    考虑以下情况:我们有多个应用程序使用 Spr ng Cloud Config 读取属性,而S ring Cloud Config 从GIT 读取这些属性. 下面的例子中多个员工生产者模块从 Employe ...

  2. 如何获取 topic 主题的列表?

    bin/kafka-topics.sh --list --zookeeper localhost:2181

  3. 什么是Hystrix断路器?我们需要它吗?

    由于某些原因,employee-consumer公开服务会引发异常.情况下使用Hystrix我们定义了回退方法.如果在公开服务中发生异常,则回退方法返回一些默认值 . 如果firstPage metho ...

  4. Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行,它们有什么区别?

    sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回 ...

  5. Java 线程数过多会造成什么异常?

    1.线程的生命周期开销非常高 2.消耗过多的 CPU 资源 如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置.大量空 闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争  ...

  6. 阿里低代码引擎 | LowCodeEngine - 如何配置并调用请求

    首发于 语雀文档@blueju 前言 发送请求是前端中很重要也很常见的一部分,阿里低代码引擎自然也不会缺少这一块.在阿里低代码引擎中,请求是在数据源中配置,数据源位置如下图: 配置 配置界面如下图:其 ...

  7. WzwJDBC 自定义工具类(获取连接,释放资源)

    package wzwUtil;import java.io.IOException;import java.io.InputStream;import java.sql.*;import java. ...

  8. 【Flutter】Flutter C/C++ 插件的开发 (支持 windows、macos、ios、android )

    一个各平台调用 C/C++ 源码的例子,如何共享代码,配置相关的编译 官方的例子:https://docs.flutter.dev/development/platform-integration/c ...

  9. GoLang数组切片

    1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...

  10. Android优化应用启动速度

    一.应用的启动 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动 ...