InnoDB聚集索引如何定位到数据的物理位置

时间:2019-12-25 16:17:41   收藏:0   阅读:173

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。这与Oracle的索引结构相似,比较好理解。那么,常用的Innodb聚集索引结构是怎样的呢?

InnoDB的数据文件本身(.ibd文件)就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

技术分享图片

上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

 

可能上面的描述还不够直观,我又翻阅了《MySQL技术内幕:Innodb存储引擎》一书,在其第172页找到了如下图片。

 

技术分享图片

 

 

 

 

可以看出,聚集索引非叶子节点中,Pointer(索引键值)指向的是ibd文件的Page Offset,这样就定位到数据的物理位置了。通过操作系统的inode,就能找到磁盘中的具体数据块了。

找到数据块,将它读入Innodb buffer pool,然后通过page header中的数据结构,就能定位到行记录了。

 参考链接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

原文:https://www.cnblogs.com/dba-john/p/12096666.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!