zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

谈谈什么是MySQL的表空间?

mysql 什么 空间 谈谈
2023-09-27 14:25:58 时间
这其实是一个概念性的知识点,当作拓展知识。涉及到的概念大家了解一下就好,涉及的参数,留个印象就好。

今天我要跟你分享的话题是 “大家常说的表空间到底是什么 究竟什么又是数据表 ”

这其实是一个概念性的知识点 当作拓展知识。涉及到的概念大家了解一下就好 涉及的参数 留个印象就好。


一、什么是表 #

但凡是用过MySQL都知道 直观上看 MySQL的数据都存在数据表中。

比如一条Update SQL


update user set username 白日梦 where id 999;


它将user这张数据表中id为1的记录的username列修改成了‘白日梦’

这里的user其实就是数据表。当然这不是重点 重点是我想表达 数据表其实是逻辑上的概念。而下面要说的表空间是物理层面的概念。


二、什么是表空间 #

不知道你有没有看到过这句话 “在innodb存储引擎中数据是按照表空间来组织存储的”。其实有个潜台词是 表空间是表空间文件是实际存在的物理文件。

大家不用纠结为啥它叫表空间、为啥表空间会对应着磁盘上的物理文件 因为MySQL就是这样设计、设定的。直接接受这个概念就好了。

MySQL有很多种表空间 下面一起来了解一下。


三、sys表空间#

你可以像下面这样查看你的MySQL的系统表空间


image


Value部分的的组成是 name:size:attributes

默认情况下 MySQL会初始化一个大小为12MB 名为ibdata1文件 并且随着数据的增多 它会自动扩容。


这个ibdata1文件是系统表空间 也是默认的表空间 也是默认的表空间物理文件 也是传说中的共享表空间。


关于这个共享表空间 直观上看 如果这个表空间能为multiple tables.存储数据 那么它就可以被称为共享表空间 所以你可以认为系统表空间是共享表空间。


四、配置sys表空间#

系统表空间的数量和大小可以通过启动参数 innodb_data_file_path

# my.cnf

[mysqld]

innodb_data_file_path /dir1/ibdata1:2000M;/dir2/ibdata2:2000M:autoextend


ibdata1表空间为固定大小2000M 而ibdata2的2000M使用完后会自动增长。

假设你的服务器有两块存储A、B。并且A、B上分别挂载着dir1目录和dir2目录。那你再看上面的配置 它其实是在使用两个不同磁盘上的文件共同构建表空间。由于这两个文件位于不同的磁盘上 磁盘的负载就会被均分 数据库整体的性能也有所提升。


五、file per table 表空间#

如果你想让每一个数据库表都有一个单独的表空间文件的话 可以通过参数innodb_file_per_table设置。


这个参数只有在MySQL5.6或者是更高的版本中才可以使用。


可以通过配置文件


[mysqld]

innodb_file_per_table ON


也可以通过命令


mysql SET GLOBAL innodb_file_per_table 


image


让你将其设置为ON 那之后InnoDB存储引擎产生的表都会自己独立的表空间文件。

独立的表空间文件命名规则 表名.ibd


注意

独立表空间文件中仅存放该表对应数据、索引、insert buffer bitmap。

其余的诸如 undo信息、insert buffer 索引页、double write buffer 等信息依然放在默认表空间 也就是共享表空间中。

这里的undo、insert buffer、double write buffer 如果你不了解他们是啥也没关系。按照大纲排期 我会在第 41、42 篇文中跟大家分享。在这里只需要先了解即使你设置了innodb_file_per_table ON 共享表空间的体量依然会不断的增长 并且你即使你不断的使用undo进行rollback 共享表空间大小也不会缩减就好了。


查看我的表空间文件


image


最后再简述一下这种file per table的优缺点


优点

提升容错率 表A的表空间损坏后 其他表空间不会收到影响。s使用MySQL Enterprise Backup快速备份或还原在每表文件表空间中创建的表 不会中断其他InnoDB 表的使用


缺点

对fsync系统调用来说不友好 如果使用一个表空间文件的话单次系统调用可以完成数据的落盘 但是如果你将表空间文件拆分成多个。原来的一次fsync可能会就变成针对涉及到的所有表空间文件分别执行一次fsync 增加fsync的次数。


fsync我计划会在第 18 篇文章中跟大家分享。欢迎关注 持续更新中


六、临时表空间#

临时表空间用于存放用户创建的临时表和磁盘内部临时表。


参数innodb_temp_data_file_path定义了临时表空间的一些名称、大小、规格属性如下图


image


查看临时表空间文件存放的目录


image


七、undo表空间#

相信你肯定听过说undolog 常见的当你的程序想要将事物rollback时 底层MySQL其实就是通过这些undo信息帮你回滚的。

在MySQL的设定中 有一个表空间可以专门用来存放undolog的日志文件。

然而 在MySQL的设定中 默认的会将undolog放置到系统表空间中。

如果你的MySQL是新安装的 那你可以通过下面的命令看看你的MySQL undo表空间的使用情况

image


大家可以看到 我的MySQL的undo log 表空间有两个。

也就是我的undo从默认的系统表空间中转移到了undo log专属表空间中了。


image


那undo log到底是该使用默认的配置放在系统表空间呢 还是该放在undo表空间呢

这其实取决服务器使用的存储卷的类型。

如果是SSD存储 那推荐将undo info存放在 undo表空间中。


白日梦计划在第19篇文章中跟大家分享 undolog 相关的知识点。欢迎关注


参考

https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-file-per-table-tablespaces.html

https://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html



推荐阅读#大家常说的基数是什么 已发布 讲讲什么是慢查 如何监控 如何排查 已发布 对NotNull字段插入Null值有啥现象 已发布 能谈谈 date、datetime、time、timestamp、year的区别吗 已发布 了解数据库的查询缓存和BufferPool吗 谈谈看 已发布 你知道数据库缓冲池中的LRU-List吗 已发布 谈谈数据库缓冲池中的Free-List 已发布 谈谈数据库缓冲池中的Flush-List 已发布 了解脏页刷回磁盘的时机吗 已发布 用十一张图讲清楚 当你CRUD时BufferPool中发生了什么 以及BufferPool的优化 已发布 听说过表空间没 什么是表空间 什么是数据表 (已发布)谈谈MySQL的 数据区、数据段、数据页、数据页究竟长什么样 了解数据页分裂吗 谈谈看 (已发布)谈谈MySQL的行记录是什么 长啥样 (已发布)了解MySQL的行溢出机制吗 (已发布)说说fsync这个系统调用吧! (已发布)简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)我劝 这位年轻人不讲MVCC 耗子尾汁 (已发布)MySQL的崩溃恢复到底是怎么回事 (已发布)MySQL的binlog有啥用 谁写的 在哪里 怎么配置 (已发布)MySQL的bin log的写入机制 (已发布)
几种常见的MySQL/PolarDB-MySQL回收表空间方法对比 当我们频繁的删除表中的数据后,碎片就会变多,有经验的DBA就会回收表空间,回收表空间有好几种方式,我们要选择哪一种呢?
面试官:mysql 表删除一半数据,表空间会变小吗? 哈喽,我是狗哥。小伙伴都知道我最近换工作了,薪资、工作内容什么的都是我比较满意的。五月底也面试了有 6、7 家公司,应该拿了有 5 个 offer。这段时间也被问了很多面试题,我打算写一个专题分享出来,希望对你们有所帮助~
mysql表空间查看及创建 mysql 查看表空间show variables like %innodb_data_file_path% --创建undo日志文件组: CREATE LOGFILE GROUP logGroup1 ADD UNDOFILE E:\J2EE\MySQL\logGroup1_1.