InnoDB中逻辑存储结构的示例分析
这篇文章主要为大家展示了“InnoDB中逻辑存储结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“InnoDB中逻辑存储结构的示例分析”这篇文章吧。
InnoDB逻辑存储结构在InnoDB中我们创建的表还有对应的索引数据都存储在扩展名为.ibd 的文件中,这个文件路径可以先通过查mysql变量datadir
来得到,然后进入对应的数据库名目录,会看到很多ibd,文件名就是表名,这里有两种类型的表空间,共享表空间(或者叫系统表空间)和独立表空间文件。
对于共享表空间,所有的表数据和相应索引都存放在这里,而独立表空间,就是每个表的数据和索引都存放在一个单独的ibd文件中,在目前的MySQL版本中,默认都是使用的独立表空间。
共享表空间文件名可以通过innodb_data_file_path
得到,
mysql>showvariableslike'innodb_data_file_path';+-----------------------+------------------------+|Variable_name|Value|+-----------------------+------------------------+|innodb_data_file_path|ibdata1:12M:autoextend|+-----------------------+------------------------+1rowinset(0.00sec)
独立和共享表空间可以通过innodb_file_per_table
切换,如果启用了他,那么每张表内的数据就单独放在一个表空间文件中,还需要注意,每个表的表空间只存储数据、索引,其他类的数据,如回滚信息、系统事务信息、二次写缓冲仍存储在原始共享表空间中。
下面语句可以查看innodb_file_per_table
的状态。
mysql>showvariableslike'%innodb_file_per_table';+-----------------------+-------+|Variable_name|Value|+-----------------------+-------+|innodb_file_per_table|ON|+-----------------------+-------+1rowinset(0.01sec)
修改innodb_file_per_table
状态
setglobalinnodb_file_per_table=0;
如果在innodb_file_per_table
等于0的情况下,也就是OFF关闭情况下,创建的表都会存放的系统共享的表空间中,比如下面的列子。
1.创建database_1数据库mysql>createdatabasedatabase_1;QueryOK,1rowaffected(0.02sec)2.当前状态mysql>showvariableslike'%innodb_file_per_table';+-----------------------+-------+|Variable_name|Value|+-----------------------+-------+|innodb_file_per_table|ON|+-----------------------+-------+1rowinset(0.01sec)3.创建表mysql>createtablet1(idint(11));QueryOK,0rowsaffected,1warning(0.05sec)4.查看ibd文件root@hxl-PC:/var/lib/mysql/database_1#lst1.ibdroot@hxl-PC:/var/lib/mysql/database_1#5.关闭innodb_file_per_table后在创建表mysql>setglobalinnodb_file_per_table=0;QueryOK,0rowsaffected(0.01sec)mysql>createtablet2(idint(11));QueryOK,0rowsaffected,1warning(0.05sec)6.查看ibd文件root@hxl-PC:/var/lib/mysql/database_1#lst1.ibd
可以发现在关闭后,没有创建新的ibd文件。
表空间又由段(segment)、区(extent)、页(page)组成,引入一张网络图片。
1.段表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由N个区和32个零散的页组成。
InnoDB存储引擎表是索引组织的,所以数据就是索引,索引就是数据,通常情况下,创建一个索引的同时就会创建两个段,分别为非叶子节点和叶子节点段。
2.区区是由连续的页组成的空间,无论如何,每个区的大小都是1MB。为了保证区域内页面的连续性,InnoDB存储引擎一次从磁盘申请4-5个区域。默认情况下,InnoDB存储引擎的页面大小为16KB,也就是有有64个连续页面,16*64=1024=1M。
InnoDB1.2.x版本增加了参数innodb_page_size
,这个参数允许设置默认页面大小为4K、8K,
页是InnoDB存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size
设置页大小为4K、8K、16K 。InnoDB为了实现不同的目的而设计了很多种页,InnoDB 存储引擎中常见的页面类型有:
数据页
undo页面
系统页面
事物数据页面(交易系统页面)
插入缓冲位图页
插入缓冲区空闲列表页
未压缩的二进制大对象页面
压缩二进制大对象页面
可以通过以下命令查看大小。
mysql>showstatuslike'innodb_page_size';+------------------+-------+|Variable_name|Value|+------------------+-------+|Innodb_page_size|16384|+------------------+-------+1rowinset(0.00sec)mysql>
下面是InnoDB数据页结构,它由七部分组成。
InnoDB存储引擎是面向行的,页里面又记录着行记录的信息,也就是数据是按照行存储的。行记录数据又是按照行格式进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200行,也就是7992行。
InnoDB存储引擎有两种文件格式,一种叫Antelops,另外一种叫Barracuda。
在Antelope文件格式下,有compact和redundant两种行记录格式。
在Barracuda文件格式下,有compressed和dynamic两种行记录格式。
可以通过以下方式查看当前格式,其中Row_format就是对应行格式存储类型。
mysql>showtablestatus\G;***************************1.row***************************Name:t1Engine:InnoDBVersion:10Row_format:DynamicRows:15Avg_row_length:1092Data_length:16384Max_data_length:0Index_length:0Data_free:0Auto_increment:NULLCreate_time:2021-08-2409:43:29Update_time:2021-08-2414:43:35Check_time:NULLCollation:utf8mb4_0900_ai_ciChecksum:NULLCreate_options:Comment:
以上是“InnoDB中逻辑存储结构的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。