首页
运维教程
Linux基础
系统服务
系统架构
数据库
shell脚本
虚拟化
大数据
DevOps
企业案例
运维开发
python
go语言
运维安全
行业资讯
网络基础
系统安全
运维面试
学习路线
学习方法
面试题库
职场解惑
软件
运维软件
办公软件
书籍资源
技术陪跑营
重要信息
首页 运维教程数据库【MySQL】lnnoDB存储引擎你是怎么理解的?

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

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> 

数据库默认的自动扩展大小是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
2) 独立表空间
mysql> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set

默认是开启的,如果没有开启设置 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

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

本文链接:http://www.geekyunwei.com/1181.html

网友评论comments

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2021 极客运维 公众号《极客运维之家》
扫二维码
扫二维码
返回顶部