learn_note/数据库/Mysql/Mysql-InnoDB/聚簇索引和二级索引.md

2.0 KiB
Raw Blame History

聚簇索引和二级索引

原文链接

主键索引是InnoDB存储引擎默认给我们创建的一套索引结构我们表里的数据也是直接放在主键索引里作为叶子节点的数据页。

但我们在开发的过程中,往往会根据业务需要在不同的字段上建立索引,这些索引就是二级索引,今天我们就给大家讲讲二级所有的原理。

比如你给name字段加了一个索引你插入数据的时候就会重新搞一棵B+树B+树的叶子节点也是数据页但是这个数据页里仅仅放了主键字段和name字段。

叶子节点的数据页的name值跟主键索引一样的都是按照大小排序的。同一个数据页里的name字段值都是大于上一个数据页里的name字段值。

name字段的B+树也会构建多层索引页这个索引页里放的是下一层的页号和最小name字段值。就像这样

假设你要根据name字段来搜索数据比如select * from user where name=xxx'过程与主键索引一样的。从name索引的根节点开始找一层一层的向下找一直找到叶子节点定位到name字段值对应的主键值。

但此时叶子节点的数据页没有完整所有字段,就需要根据主键到主键索引里去查找,从主键索引的根节点一路找到叶子节点,就可以找到这行数据的所有字段了,这个过程就叫回表。

二级索引可以对多个字段建立联合索引比如name + age + sex

此时联合索引与单个字段的索引原理是一样的只不过叶子节点的数据页里放的是id + name + age + sex然后默认按照name排序name一样就按age排序age一样就按sex排序。

每个name + age +sex的索引页里放的就是下层节点的页号和最小的name + age + sex值。当你用name + age + sex搜索的时候就会走name + age + sex联合索引这棵树再回表查询。