MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
1256 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
课后题答疑 (3讲)
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

InnoDB存储引擎篇|课后题答疑

你好,我是俊达。今天我们继续看第三章的思考题。

第 25 讲

问题:我们都知道 InnoDB 中每个索引都由 2 个段(Segment)组成,每个段由一系列区(Extent)组成,每个区的大小为 1M。类似我们测试中的这个表,只写入了几行数据,那么为这个表分配一个区,是不是会有大量的空间浪费?MySQL 是怎么解决这个问题的?
@叶明 在评论区提供了这个问题的解答。
第 26 讲中对这个问题也有解释。InnoDB 每个索引都有 2 个段组成。每个段都有一个对应的 Inode 结构,用来跟踪一个段由哪些页面组成。
Inode 中,有一个碎片页数组,可以记录 32 个页面的编号。
在给一个段分配空间时,会先以 1 个页面为单位分配,只有当 32 个碎片页都分配后,才会按 1 个区为单位,分配空间。
一个表刚创建时,表里还没有写入任何数据。InnoDB 会给每个索引分配一个 Root 页面,而每个索引对应的 2 个段,此时只有 1 个段分配了页面,另外一个段里暂时还没有任何页面。
创建一个空的表,会占用多少磁盘空间呢?这跟表上的索引个数有关,因为要给每个索引分配一个 Root 页面。MySQL 最多可以建 64 个索引(包括主键索引),你可以测试下,建一个有 64 个索引的空表,看一下 ibd 文件的大小。我测试下来,建一个有 64 个索引的空表,ibd 文件是 8 兆。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. InnoDB存储引擎中的索引由2个段组成,每个段由一系列区组成,每个区的大小为1M,但在表刚创建时,会给每个索引分配一个Root页面,因此创建一个空的表会占用磁盘空间,且与表上的索引个数有关。 2. MySQL解决InnoDB表分配区空间的问题是先以1个页面为单位分配,只有当32个碎片页都分配后,才会按1个区为单位分配空间。 3. 数据字典表存储在mysql.ibd文件中,数据库初始化时,会按顺序分配这些表的索引的ROOT页面,而数据字典表的索引的Root页面编号存在dd_properties表里,dd_properties表主键的Root页面编号固定为4。 4. 数据字典表的结构是在源代码中定义的,数据字典表的属性保存到DD_PROPERTIES表,下次数据库启动时,DD_PROPERTIES表的Root页面编号固定为4,其他索引的Root页面编号从DD_PROPERTIES表里读取。 5. 数据字典表中存储了每个表的定义,包括表里有哪些字段、每个字段的数据类型是什么、表上有哪些索引等等。 6. MySQL 8.0中,数据字典存储在了InnoDB表中,而数据字典表本身也是一个InnoDB表,查询数据字典表的前提是先要知道这些表的元数据。 7. 数据库初始化时,按一定的顺序,创建数据字典表,第一个创建的是DD_PROPERTIES表。 8. 删除表和索引时,InnoDB会 passively 移除被删除或截断的表空间的页面,而不再立即进行全面的列表扫描,这在MySQL 8.0.23版本中得到了优化。 9. 事务提交时,MySQL不会生成COMMIT类型的Redo日志,而是通过设置Undo State来标记事务的提交状态,确保即使数据库异常重启,Undo段的状态也能正确恢复。 10. 在MySQL 8.0中,可以使用Undo表空间的自动收缩功能或手动回收空间来缩减Undo表空间的大小.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部