前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于InnoDB表数据和索引数据的存储

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

作者头像
程序员欣宸
发布2019-05-26 21:50:10
1K0
发布2019-05-26 21:50:10
举报
文章被收录于专栏:实战docker实战docker

版权声明:欢迎转载,请注明出处,谢谢。

来自Mysql官方的说明

  1. 来看官方文档中对InnoDB的介绍,地址是:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html
在这里插入图片描述
在这里插入图片描述

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

  1. 下图信息表明聚簇索引保存了数据行,搜索索引就能直接找到行数据,地址是: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的解释

  1. Jeremy Cole的个人信息介绍:https://blog.jcole.us/about-me/
  2. 来看看存储索引和数据的idb文件的结构,如下图:
在这里插入图片描述
在这里插入图片描述

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

  1. 关于节点页和叶子页的详情,以及每个聚簇索引结构体内容的详情,请看Jeremy Cole博客的图片集,地址是:https://github.com/jeremycole/innodb_diagrams
  2. 重点来了,大神有句简单的小结:Everything is an index in InnoDB,如下图所示,绿框中指出表数据存储在主键索引的结构图中,地址在:https://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/
在这里插入图片描述
在这里插入图片描述

反思

  1. 向数据库新增一条记录会保存索引数据和表数据,但并不代表会分别写索引文件和表数据文件,以前犯的是想当然错误;
  2. 之前的疑问是"索引文件中有数据行,那表数据文件有啥用",没有放过这个疑问,而是去刨根问底,终于有所收获;
  3. 虽然搜索一些中文文章也有答案,但搜索权威著作或者大神文章,能把问题理得更清晰,而且通过翻阅相关的目录和章节还能获得更全面的答案;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 来自Mysql官方的说明
  • 我的疑问
  • 来自《高性能MySql》的解释
  • Jeremy Cole的解释
  • 反思
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档