您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

深入学习MySQL,了解InnoDB的逻辑存储结构

2024/5/31 15:36:09发布57次查看
本篇文章带大家了解一下innodb逻辑存储结构,希望对大家有所帮助!
innodb逻辑存储结构在innodb中我们创建的表还有对应的索引数据都存储在扩展名为.ibd 的文件中,这个文件路径可以先通过查mysql变量datadir来得到,然后进入对应的数据库名目录,会看到很多ibd,文件名就是表名,这里有两种类型的表空间,共享表空间(或者叫系统表空间)和独立表空间文件。【相关推荐:mysql视频教程】
对于共享表空间,所有的表数据和相应索引都存放在这里,而独立表空间,就是每个表的数据和索引都存放在一个单独的ibd文件中,在目前的mysql版本中,默认都是使用的独立表空间。
共享表空间文件名可以通过innodb_data_file_path得到,
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的状态。
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状态
set global innodb_file_per_table=0;
如果在innodb_file_per_table等于0的情况下,也就是off关闭情况下,创建的表都会存放的系统共享的表空间中,比如下面的列子。
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# lst1.ibdroot@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# 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,
3.页页是innodb存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size设置页大小为4k、8k、16k 。innodb为了实现不同的目的而设计了很多种页,innodb 存储引擎中常见的页面类型有:
数据页
undo页面
系统页面
事物数据页面(交易系统页面)
插入缓冲位图页
插入缓冲区空闲列表页
未压缩的二进制大对象页面
压缩二进制大对象页面
可以通过以下命令查看大小。
mysql> show status like 'innodb_page_size';+------------------+-------+| variable_name | value |+------------------+-------+| innodb_page_size | 16384 |+------------------+-------+1 row in set (0.00 sec)mysql>
下面是innodb数据页结构,它由七部分组成。
名称作用
file header 记录了页头的一些信息,cheksum、ppervious和next page的记录
page header 记录了页的状态信息和存储信息、首个记录的position
infimum+ supremum innodb每个数据页有两个虚拟行记录,用来限定记录边界
row records 实际存储的行数据信息
free space 空闲空间,同样是链表结构
page directory 存放了记录的相对位置
file trailer innodb利用它来保证页完整地写入磁盘
4.行innodb存储引擎是面向行的,页里面又记录着行记录的信息,也就是数据是按照行存储的。行记录数据又是按照行格式进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16kb/2-200行,也就是7992行。
innodb存储引擎有两种文件格式,一种叫antelops,另外一种叫barracuda。
在antelope文件格式下,有compact和redundant两种行记录格式。
在barracuda文件格式下,有compressed和dynamic两种行记录格式。
可以通过以下方式查看当前格式,其中row_format就是对应行格式存储类型。
mysql> show table status \g;*************************** 1. row *************************** name: t1 engine: innodb version: 10 row_format: dynamic rows: 15 avg_row_length: 1092 data_length: 16384max_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:
原文地址:https://juejin.cn/post/6999936914119720996
作者:i听风逝夜
更多编程相关知识,请访问:编程视频!!
以上就是深入学习mysql,了解innodb的逻辑存储结构的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product