首页 / 知识
MySQL二级索引的查询过程
2023-04-11 13:09:00

聚簇索引就是innodb默认创建的基于主键的索引结构,而且表里的数据就是直接放在聚簇索引里,作为叶节点的数据页:
基于主键的数据搜索:从聚簇索引的根节点开始进行二分查找,一路找到对应数据页,基于页目录就直接定位到主键目标数据。
若想对其它字段建立索引,甚至是基于多个字段建立联合索引,此时索引结构又是咋样?
假设对其他字段建立索引,如name、age之类,都是一样原理。比如你插入数据时:
把完整数据插入聚簇索引的叶节点的数据页,同时维护好聚簇索引
为你其他字段建立的索引,重新再建立一颗B+树
比如你基于name字段建立了一个索引,当插入数据时,就会重新搞一颗B+树,B+树的叶节点也是数据页,但该数据页里仅放主键字段和name字段:
这是独立于聚簇索引之外的另一个name字段的B+索引树,其叶节点的数据页仅存放主键和name字段值。
整体排序规则都跟聚簇索引按照主键的排序规则是一样,即:
叶节点的数据页中的name值都是排序的
下一个数据页里的name字段值都>上一个数据页里的name字段值
name字段的索引B+树也会构建多层级的索引页,索引页里存放:
下一层的页号
最小name字段值,根据name字段值排序。
所以若你根据name字段查数据,过程也一样,从name索引树的根节点开始,一层一层往下找,一直找到叶节点的数据页,定位到name字段值对应的主键值。
然后针对
select * from t where name='xx'
1
这种语句,先根据name值在name索引树里找,找到叶节点,也仅能找到对应主键值,而找不到这行数据的所有字段。
所以还需回表:还需根据主键值,再到聚簇索引里从根节点开始,找到叶节点的数据页,定位到主键值对应的完整数据行,此时才能把select *要的全部字段值都取出。
联合索引
比如name+age,运行流程同理,建立一个独立的B+树,叶节点的数据页存放id+name+age后,默认按name排序,name一样就按age排,不同数据页之间的name+age值的排序也如此。
然后这个name+age的联合索引的B+树的索引页存放:
下一层节点的页号
最小的name+age的值
所以当你根据name+age搜索时,就会走name+age联合索引树,搜索到主键,再根据主键到聚簇索引里去搜索。
总结
以上就是InnoDB索引的实现原理,就是建立B+树,层层二分查找。不同的索引就是建立了不同B+树,然后增删改时:
在数据页里更新数据
维护你所有的索引
|
最新内容
相关内容
python如何调用mysql
python如何调用mysql,培训,流程,一致,密码,数据,数据库,数据库连接,接口,语句,方法,DB-API是一个规范.它定义了一系列必须的对象和数据库存取python一个数的平方怎么表示
python一个数的平方怎么表示,培训,平方根,个数,函数,模块,表示,方法,表达式,实例,下面,用python进行数学计算,可以使用python内置的函数模块,下python如何求一个数的平方
python如何求一个数的平方,培训,平方根,个数,整数,函数,模块,方法,小数,表达式,数值,用python进行数学计算,可以使用python内置的函数模块,下面pythonpython是什么类型的语言
pythonpython是什么类型的语言,培训,系统,教育,软件,电脑,代码,简介,人工智能,类型,语言,python是一种面向对象、解释型、动态类型计算机程序python哪个版本是免费的
python哪个版本是免费的,培训,发行,通用,项目,设计,版本,以上,语言,计算机,构架,python是免费的,也就是开源的。目前市面上主流的版本有pythonpython判断字符串是否为小数的方法
python判断字符串是否为小数的方法,培训,代码,合法,小数点,小数,整数,字符串,方法,右边,左边,python想判断一个字符串是不是一个合法的小数,但python怎么求一个数的平方
python怎么求一个数的平方,培训,平方根,个数,函数,模块,方法,表达式,实例,下面,以上,用python进行数学计算,可以使用python内置的函数模块,下面python类、模块、包的概念及区别
python类、模块、包的概念及区别,概念,数据,培训,模块,名字,环境,基础,文件,函数,定义,类类的概念在许多语言中出现,是面向对象编程的基础,很容python如何实现对Python中列表的排
python如何实现对Python中列表的排序?,培训,工作,实例,方法,关键字,对象,函数,以上,列表,表达式,对List进行排序,Python提供了两个方法方法1.python语言的全排列怎么提速?
python语言的全排列怎么提速?,培训,情况,代码,排列,元素,程序,方法,之后,语言,生成器,python从n个不同元素中任取m(m≤n)个元素,按照一定的顺python模块能优化Python的运行速度
python模块能优化Python的运行速度吗?,代码,平台,培训,官网,环境,工作,系统,模块,程序,语言,今天介绍下Psyco模块,Psyco模块可以使你的Pythonpython调用函数和打印函数的区别
python调用函数和打印函数的区别,培训,函数,区别,变量,实例,分配,以上,参数,东西,更多,python调用函数和打印函数的区别1、当你调用一个返回