【MySQL】lnnoDB存储引擎你是怎么理解的?

举报
互联网老辛 发表于 2021/06/09 00:39:38 2021/06/09
【摘要】 InnoDB逻辑存储单元主要分为表空间,段,区和页 1. 表空间 InnoDB所有的数据都是存放在表空间的,表空间又分为系统表空间和独立表空间 MySQL5.7之后又多了临时表空间和通用表空间 1) 系统表空间 其中系统表空间,主要是以ibdata1来命名。 在安装数据库初始化数据库时就是系统在创建一个ibddata1的表空间文件,它会存储所有数据的信息以及回...

InnoDB逻辑存储单元主要分为表空间,段,区和页

1. 表空间

InnoDB所有的数据都是存放在表空间的,表空间又分为系统表空间和独立表空间

MySQL5.7之后又多了临时表空间和通用表空间

1) 系统表空间

其中系统表空间,主要是以ibdata1来命名。
在安装数据库初始化数据库时就是系统在创建一个ibddata1的表空间文件,它会存储所有数据的信息以及回滚段(undo)的信息。

innodb_data_file_path 负责定义系统表空间的路径,初始化大小,自动扩展策略,如下:
数据库MySQL8中,ibdata1默认大小是12M

mysql> show variables like '%data_file%';
+----------------------------+------------------------+
| Variable_name | Value |
+----------------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
| innodb_temp_data_file_path | ibtmp1:12M:autoextend  |
+----------------------------+------------------------+
2 rows in set

mysql> 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

数据库默认的自动扩展大小是64M,如下:

innodb_autoextend_increment 默认是64M

mysql> show variables like '%auto
%';
+----------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------+-------+
| auto_generate_certs | ON |
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
| caching_sha2_password_auto_generate_rsa_keys | ON |
| innodb_autoextend_increment | 64   |
| innodb_autoinc_lock_mode | 2 |
| innodb_stats_auto_recalc | ON |
| sha256_password_auto_generate_rsa_keys | ON |
| sql_auto_is_null | OFF   |
+----------------------------------------------+-------+
11 rows in set

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
2) 独立表空间
mysql> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

默认是开启的,如果没有开启设置 innodb_file_per_table=1即可。

每个表都有自己的独立表空间,可以实现表空间的转移,回收表空间也特别的方便,不需要存储在idbdata1中,独立表空间文件存储对应表的B+树结构,索引以及插入缓冲等信息。 其余的信息还是存放在默认表空间里。

缺点在于每个表都有.frm 和.ibd 两个文件描述符,如果单标增长过快,就容易出现性能问题。

共享表空间的数据和文件放在一起便于管理,但无法回收, 统计分析及日志类系统不太适合用共享表空间。

2. 段

表空间是由段组成的,也可以把一个表理解为一个段。通常有数据段,回滚段,索引段等。
每个段由N个区和32个零散的页组成,段空间扩展是以区为单位进行扩展。

一般情况下,创建一个索引的同时会创建两个段,分别为非子叶节点段和子叶节点段。

一个表有4个段

3. 区

区是由连续的页组成的,是物理上连续分配的一段空间,每个区的大小固定为1M, 区等于64个页,也就是64*16kb=1M

4. 页

innodb的最小物理存储分配单位是page,有数据页,回滚页,一般情况下,一个区由64个连续的页组成,页默认大小为16KB,如下表:

innodb_page_size 16384

mysql> show variables like '%page
%';
+--------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------+-----------+
| innodb_doublewrite_pages | 4 |
| innodb_log_compressed_pages | ON |
| innodb_max_dirty_pages_pct | 90.000000 |
| innodb_max_dirty_pages_pct_lwm | 10.000000 |
| innodb_page_cleaners | 1 |
| innodb_page_size | 16384 |
| innodb_stats_persistent_sample_pages | 20 |
| innodb_stats_transient_sample_pages  | 8 |
| large_page_size | 0 |
| large_pages | OFF |
+--------------------------------------+-----------+
10 rows in set

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

页里面记录的是行信息,数据在innodb里是按照行来存储的。

文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。

原文链接:zmedu.blog.csdn.net/article/details/110202716

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。