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
网友评论