写点什么

详细解读 MySQL 中的 B+Tree 落地形式

作者:秋水
  • 2021 年 12 月 13 日
  • 本文字数:939 字

    阅读完需:约 3 分钟

详细解读MySQL中的B+Tree 落地形式

插达式的存储引擎 MySQL 最大的优势:索引是有存储引擎实现的

MySQL5.5 版本之前 默认的存储引擎是 MyISAM,5.5 版本之后 InnoDB 成了默认的存储引擎

MySQL 数据存储文件

InnoDB 的表有两个文件( .frm 和.ibd) , MyISAM 的表有三个文件( .frm、 .MYD、 .MYI) 。

有一个是相同的文件, .frm。 .frm 是 MySQL 里面表结构定义的文件。


MyISAM

在 MyISAM 里面, 另外有两个文件:

一个是.MYD 文件, D 代表 Data, 是 MyISAM 的数据文件, 存放数据记录, 比如我们的 user_myisam 表的所有的表数据。

一个是.MYI 文件, I 代表 Index, 是 MyISAM 的索引文件, 存放索引, 比如我们在 id 字段上面创建了一个主键索引, 那么主键索引就是在这个索引文件里面。也就是说, 在 MyISAM 里面, 索引和数据是两个独立的文件。

MyISAM 的 B+Tree 里面, 叶子节点存储的是数据文件对应的磁盘地址。 所以从索引文件.MYI 中找到键值后, 会到数据文件.MYD 中获取相应的数据记录。


如果是辅助索引, 有什么不一样呢?

ALTER TABLE user_innodb DROP INDEX index_user_name;

ALTER TABLE user_innodb ADD INDEX index_user_name (name);

在 MyISAM 里面, 辅助索引也在这个.MYI 文件里面。 辅助索引跟主键索引存储和检索数据的方式是没有任何区别的, 一样是在索引文件里面找到磁盘地址, 然后到数据文件里面获取数据。


InnoDB

InnoDB 只有一个文件(.ibd 文件) 。在 InnoDB 里面, 它是以主键为索引来组织数据的存储的, 所以索引文件和数据文件是同一个文件,都在.ibd 文件里面。在 InnoDB 的主键索引的叶子节点上, 它直接存储了我们的数据。

聚集索引就是索引中的数据物理存放地址和索引的顺序是一致的(比如字典的目录是按拼音排序的,内容也是按拼音排序的, 按拼音排序的这种目录就叫聚集索引) 。

所以在 InnoDB 里面, 主键索引是聚集索引, 非主键都是非聚集索引。

那主键之外的索引, 比如我们在 name 字段上面建的普通索引, 又是怎么存储和检索数据的呢?


InnoDB 中, 主键索引和辅助索引是有一个主次之分的。

辅助索引存储的是辅助索引和主键值。 如果使用辅助索引查询, 会根据主键值在主键索引中查询,最终取得数据。比如我们用 name 索引查询 name=’青山’, 它会在叶子节点找到主键值, 也就是 id=1, 然后再到主键索引的叶子节点拿到数据。

发布于: 1 小时前阅读数: 9
用户头像

秋水

关注

公众号:傲骄鹿先生。喜欢学习、沉淀、分享 2021.07.09 加入

Being away from home, we have nothing but a desire to make a figure。 公众号:傲骄鹿先生。喜欢学习、沉淀、分享

评论

发布
暂无评论
详细解读MySQL中的B+Tree 落地形式