mysql 聚簇索引 非聚簇索引

1 索引类型

1.1 聚簇索引

聚簇索引的叶子节点,存储就是数据节点。索引叶子节点的顺序和数据存储顺序一致。

1.2 非聚簇索引

非聚簇索引,叶子节点存储的是指向数据节点的指针。也就是说,数据节点无需和索引节点顺序保持一致。

2 mysql 索引

2.1 MyISAM

MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的是指向存放数据的物理块的指针。
另外,从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。


MyISAM索引结构

2.2 InnoDB
mysql 的 InnoDB引擎,主键索引和二级索引的结构有所不同。
InnoDB的主键索引是聚簇索引,因此走主键索引可以立即定位到数据所在位置。


primary key

而对于二级索引,其叶子节点存储的是索引key和主键值。因此二级索引首先查询到数据的主键值,然后再拿主键值到主键索引里查到对应的数据块。


secondary key

解释完聚簇索引和非聚簇索引,就很好理解两类索引查询数据的流程了:


数据查询流程

3 思考

  • InnoDB辅助键索引为什么存储的是主键值,而不直接存储指向数据的指针?
    如果存储数据指针的话,每次出现数据行移动或者数据页分裂时,都不得不同时更新二级索引指针。而存储主键值的话,则很好的避免了这一维护工作。

4 参考资料

https://blog.csdn.net/alexdamiao/article/details/51934917
https://www.jianshu.com/p/54c6d5db4fe6
https://blog.csdn.net/lisuyibmd/article/details/53004848

你可能感兴趣的:(mysql 聚簇索引 非聚簇索引)