索引是一种用于快速查询行的数据结构,就像书的目录是索引一样。下面这篇文章主要介绍MySQL二级索引查询过程的相关信息,有需要的朋友可以参考一下。
目录
前言联合索引摘要
前言
簇索引是innodb默认创建的基于主键的索引结构,表中的数据直接放在簇索引中作为叶节点的数据页:
基于主键的数据搜索:从聚集索引的根节点开始进行二分搜索法,一路找到对应的数据页,基于页目录直接定位主键目标数据。
如果要索引其他字段,甚至是基于多个字段构建联合索引,那么索引结构怎么办?
假设索引其他字段,如姓名、年龄等。是基于同样的原理。例如,插入数据时:
将完整的数据插入到聚簇索引的叶节点的数据页中,同时维护聚簇索引为你的其他字段建立的索引,重新建立一棵B树。
例如,如果您基于name字段建立索引,那么当您插入数据时,您将重新创建一个B树。B树的叶节点也是数据页,但是只有主键字段和名称字段放在数据页中:
这是一个B索引树,独立于聚集索引之外的另一个名称字段,其叶节点的数据页只存储主键和名称字段的值。
总体排序规则与根据主键的聚集索引相同,即:
节点的数据页中的名称值全部排序,下一个数据页中的名称字段的值大于上一个数据页中的名称字段的值。
名称字段的索引B树也将构建多级索引页面,其中:
下一级的页码具有最小的名称字段值,该值根据名称字段值排序。
所以如果根据名称字段查找数据,过程是一样的,从名称索引树的根节点开始,一层一层向下,直到找到叶节点的数据页,定位到名称字段的值对应的主键值。
然后瞄准
select * from t where name=xx
在这种语句中,首先根据名称值在名称索引树中查找,找到叶节点,只找到对应的主键值,而不是这一行数据中的所有字段。
所以需要返回表:还需要根据主键值从簇索引中的根节点开始,找到叶节点的数据页,定位主键值对应的完整数据行。只有这样才能取出select *需要的所有字段值。
联合索引
比如名字年龄,操作流程一样,建立独立的B树。叶节点的数据页存储id名称年龄后,默认按名称排序,不同数据页之间的名称年龄值也是如此。
则存储该名称年龄的联合索引的B树的索引页:
具有下一个节点的最小页码的name age的值。
所以当你按姓名年龄搜索时,你会遍历姓名年龄联合索引树,搜索主键,然后根据主键在聚集索引中搜索。
总结
以上是InnoDB索引的实现原理,即建立B树,分两层搜索。不同的索引是不同的B树,然后添加、删除和更改:
更新数据页面中的数据并维护所有索引。
关于MySQL二级索引查询过程的这篇文章到此结束。关于MySQL二级索引查询过程的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!