写点什么

关于 InnoDB 表数据和索引数据的存储

作者:程序员欣宸
  • 2022 年 7 月 18 日
  • 本文字数:951 字

    阅读完需:约 3 分钟

关于InnoDB表数据和索引数据的存储

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

来自 Mysql 官方的说明

  • 来看官方文档中对 InnoDB 的介绍,地址是:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html


  • 上图红框中表明,InnoDB 表数据的存储是按照主键的值来组织的;

  • 下图信息表明聚簇索引保存了数据行,搜索索引就能直接找到行数据,地址是:https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html


我的疑问

  • 按照上面的说法,InnoDB 表的聚簇索引在同一个结构中保存了 B-Tree 索引和数据行,了解这个知识点后,我的疑问是:既然索引中有整行记录,那么表数据文件还有什么用呢?

来自《高性能 MySql》的解释

  • 《高性能 MySql》的 5.3.5 章节对于聚簇索引的描述:


  1. 聚簇索引并不是一种单独的索引类型,而是一种数据数据存储方式;

  2. 当表有聚簇索引是,它的数据行实际上存在放在索引的叶子页(leaf page)中;

  3. 叶子页包含了行的全部数据;


  • 看来我的疑问可以解释了:索引数据和表数据分开存储这种理解在 InnoDB 是错误的,实际上 InnoDB 的表数据保存在主键索引的 B-Tree 的叶子节点;

  • 再来看看大神文章中的解释;

Jeremy Cole 的解释

  • Jeremy Cole 的个人信息介绍:https://blog.jcole.us/about-me/

  • 来看看存储索引和数据的 idb 文件的结构,如下图:



  • 从上图可见,并不存在表数据这样的内容,只有节点页(Node pages)和叶子页(Leaf pages)

  • 关于节点页和叶子页的详情,以及每个聚簇索引结构体内容的详情,请看 Jeremy Cole 博客的图片集,地址是:https://github.com/jeremycole/innodb_diagrams

  • 重点来了,大神有句简单的小结:Everything is an index in InnoDB,如下图所示,绿框中指出表数据存储在主键索引的结构图中,地址在:https://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/


反思

  1. 向数据库新增一条记录会保存索引数据和表数据,但并不代表会分别写索引文件和表数据文件,以前犯的是想当然错误;

  2. 之前的疑问是"索引文件中有数据行,那表数据文件有啥用",没有放过这个疑问,而是去刨根问底,终于有所收获;

  3. 虽然搜索一些中文文章也有答案,但搜索权威著作或者大神文章,能把问题理得更清晰,而且通过翻阅相关的目录和章节还能获得更全面的答案;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 3
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
关于InnoDB表数据和索引数据的存储_MySQL_程序员欣宸_InfoQ写作社区