
一、表空间介绍
InnoDB 其实是使用 页 为基本单位来管理存储空间的,默认的 页 大小为 16KB 。 对于 InnoDB 存储引擎来说,每个索引都对应着一棵 B+ 树,该 B+ 树的每个节点都是一个数据页,数据页之 间不必要是物理连续的,因为数据页之间有 双向链表 来维护着这些页的顺序。 InnoDB 的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。
为了更好的管理这些页,InnoDB 提出了表空间的概念,对应了文件系统上一个或者多个真实文件
1.1 系统表空间 (The System Tablespace)
系统表空间与独立表空间的一个非常明显的不同之处就是在表空间开头有许多记录整个系统属性的页面

- 存储内容: 包含InnoDB数据字典,Doublewrite Buffer,Change Buffer,Undo Logs的存储区域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。
- 具体结构: 默认情况下,InnoDB会在数据目录下创建一个名为 ibdata1 的文件,大小为 12M。这个文件就是对应的系统表空间在文件系统上的表示。为什么只有12M呢?因为这个文件是所谓的自扩展文件,即当不够用的时候它会自动增加文件大小。
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ll ibdata*
-rw-r----- 1 mysql mysql 79691776 1月 25 06:42 ibdata1
- 系统表空间是一个共享的表空间因为它是被多个表共享的。该空间的数据文件通过参数
innodb_data_file_path控制,默认值是ibdata1:12M:autoextend(文件名为ibdata1、12MB、自动扩展)。
mysql> show variables like '%innodb_data_file_path%';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.38 sec)
我们还可以将系统表空间对应的文件路径配置到数据目录之外,甚至可以配置到单独的磁盘分区上。涉及到的启动参数是innodb_data_file_path和innodb_data_home_dir,具体的配置逻辑较为复杂,需要根据实际情况进行调整。
1.2 独立表空间
默认开启,独立表空间是一个单表表空间,该表创建于自己的数据文件中,而非创建于系统表空间中。当innodb_file_per_table选项开启时,表将被创建于表空间中。否则,innodb将被创建于系统表空间中。
mysql> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.14 sec)
每个表文件表空间由一个.ibd数据文件代表,该文件默认被创建于数据库目录中。
比如我们使用了 独立表空间 去存储 xx 数据库下的 test 表的话,那么在该表所在数据库对应的 test 目录下会为 test 表创建这两个文件:
test.frm test.ibd
共享 VS 独立表空间
| 优缺点 | 共享表空间 | 独立表空间 |
|---|---|---|
| 优点 | 可以将表空间分成多个文件存放到各个磁盘上,方便管理。 | 每个表都有独立的表空间,数据和索引分开存放。 |
| 空间文件大小不受表大小的限制。 | 可以实现单表在不同的数据库中移动。 | |
| 数据和文件放在一起方便管理。 | 空间可以回收,删除或清空表后存储空间立即返回。 | |
| 缺点 | 所有数据和索引存放到一个文件中,对于大量删除操作后表空间中会有大量空隙,不适合某些应用。 | 单表增加过大可能会导致表空间过大,如超过100个G。 |
1.3 通用表空间(General Tablespaces)
- MySQL 5.7开始支持通用表空间管理功能,类似于系统表空间,也是共享表空间,可以存储多个表的数据。
- 通用表空间为通过create tablespace语法创建的共享表空间。通用表空间可以创建于mysql数据目录外的其他表空间(自定义存储路径),其可以容纳多张表,且其支持所有的行格式。
- 相比File-per-table表空间,通用表空间由于多表共享表空间,消耗的内存会更少一点,具有潜在的内存优势。(占用的磁盘空间会更小)
举例
- 需求:指定存储路径创建一张表

最低0.47元/天 解锁文章
2765

被折叠的 条评论
为什么被折叠?



