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        |
+------------------------------+
posted @   原来是你~~~  阅读(195)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示