MySQL-表空间
https://www.hyouit.com?aff=418
1、行
数据库表中的记录都是按行(row)进行存放的,每行记录根据不同的行格式,有不同的存储结构。
2、页
InnoDB 的数据是按页(page)为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个行记录从磁盘读出来,而是以页为单位,将其整体读入内存,默认每个页的大小为 16KB。
页是 InnoDB 存储引擎磁盘管理的最小单元,意味着数据库每次读写都是以 16KB 为单位的,一次最少从磁盘中读取 16K 的内容到内存中,一次最少把内存中的 16K 内容刷新到磁盘中。
- 页面结构
3、区
连续64个页为一个区,一个区就是1M。InnoDB 存储引擎是用 B+ 树来组织数据的。
B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。
在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区(extent)为单位分配。每个区的大小为 1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。
4、段
段是由多个区(extent)组成的。段一般分为数据段、索引段和回滚段等。
-
索引段:存放 B+ 树的非叶子节点的区的集合;
-
数据段:存放 B+ 树的叶子节点的区的集合;
-
回滚段:存放的是回滚数据的区的集合。
5、表空间
表空间是由各个段组成的。共有以下几种表空间形式
5.1 共享表空间
存储形式 ibdata1-ibdataN 文件,在不同版本中,存储内容做了不同修改
-
5.5 版本是默认的表空间类型,存储内容包括系统部分:(全局)数据字典信息(表基本结构信息、状态、系统参数、属性..)、UNDO回滚信息(记
录撤销操作)、Double Write buffer信息、临时表信息、change buffer;数据部分: 表数据行、表的索引数据。 -
5.6 版本只存储系统部分,把数据部分独立出去。
-
5.7 版本,在 5.6 版本基础上,把临时表空间独立出去,undo 也可以设置为独立。
-
8.0.19 版本,在 5.7 版本基础上,将undo 回滚信息默认独立,数据字典不再集中存储,只包括double write信息和change buffer。
-
8.0.20 版本,在之前的基础上,将double write信息独立出来。
共享表空间管理:
查看共享表空间设置参数:
# 定义共享表空间文件,默认初始是12M,自动扩展。
mysql> select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend |
+-------------------------+
# 每次自动扩展大小64M。
mysql> select @@innodb_autoextend_increment;
+-------------------------------+
| @@innodb_autoextend_increment |
+-------------------------------+
| 64 |
+-------------------------------+
设置共享表空间大小,重启生效。
innodb_data_file_path=ibdata1:24M;ibdata2:100M;ibdata3:100M:autoextend
- 有一点需要注意,假设原来的 value 值是 ibdata1:12M ,此处不能直接 ibdata1:12M;ibdata2:100M:autoextend 这样设置,会报错,需要先查看 ibdata1 文件当前已经使用的大小,通过操作系统 ll 命令查看该文件大小, 用这个大小设置 ibdata1:24M;ibdata2:100M:autoextend
5.7 中设置共享表空间 2-3 个,大小 512M 或 1G,最后一个自动扩展;
8.0 中设置 1-2 个,大小 512M 或者 1G
5.2 独立表空间
使用单读的文件存储表的数据和索引。通过 innodb_file_per_table 参数控制,1 单独文件存储用户数据,0 共享表空间存储用户数据。
mysql> select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
5.3 undo 表空间
查看相关参数
# undo 表空间文件的个数
mysql> select @@innodb_undo_tablespaces;
+---------------------------+
| @@innodb_undo_tablespaces |
+---------------------------+
| 2 |
+---------------------------+
# undo 日志大小,单位是字节,默认是1G。
mysql> select @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
| 1073741824 |
+----------------------------+
# 是否开启自动回收
mysql> select @@innodb_undo_log_truncate;
+----------------------------+
| @@innodb_undo_log_truncate |
+----------------------------+
| 1 |
+----------------------------+
# 触发自动回收的条件,单位是检测次数。
mysql> SELECT @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 128 |
+----------------------------------------+
回滚表空间只能在数据库初始化进行设置
5.4 临时表空间
用于存储临时表,查看该参数
mysql> select @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend |
+------------------------------+
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY