一文了解MySQL二级索引的查询过程


Posted in MySQL onFebruary 24, 2022

前言

聚簇索引就是innodb默认创建的基于主键的索引结构,而且表里的数据就是直接放在聚簇索引里,作为叶节点的数据页:

一文了解MySQL二级索引的查询过程

基于主键的数据搜索:从聚簇索引的根节点开始进行二分查找,一路找到对应数据页,基于页目录就直接定位到主键目标数据。

若想对其它字段建立索引,甚至是基于多个字段建立联合索引,此时索引结构又是咋样?

假设对其他字段建立索引,如name、age之类,都是一样原理。比如你插入数据时:

  • 把完整数据插入聚簇索引的叶节点的数据页,同时维护好聚簇索引
  • 为你其他字段建立的索引,重新再建立一颗B+树

比如你基于name字段建立了一个索引,当插入数据时,就会重新搞一颗B+树,B+树的叶节点也是数据页,但该数据页里仅放主键字段和name字段:

一文了解MySQL二级索引的查询过程

这是独立于聚簇索引之外的另一个name字段的B+索引树,其叶节点的数据页仅存放主键和name字段值。

整体排序规则都跟聚簇索引按照主键的排序规则是一样,即:

  • 叶节点的数据页中的name值都是排序的
  • 下一个数据页里的name字段值都>上一个数据页里的name字段值

name字段的索引B+树也会构建多层级的索引页,索引页里存放:

  • 下一层的页号
  • 最小name字段值,根据name字段值排序。

所以若你根据name字段查数据,过程也一样,从name索引树的根节点开始,一层一层往下找,一直找到叶节点的数据页,定位到name字段值对应的主键值。

然后针对

select * from t where name='xx'

这种语句,先根据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+树,然后增删改时:

在数据页里更新数据维护你所有的索引

到此这篇关于MySQL二级索引查询过程的文章就介绍到这了,更多相关MySQL二级索引查询过程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解mysql三值逻辑与NULL
May 19 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
mysql sock 文件解析及作用讲解
Jul 15 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
Mysql的Table doesn't exist问题及解决
Dec 24 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
教你如何让spark sql写mysql的时候支持update操作
Feb 15 #MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 #MySQL
Mysql Innodb存储引擎之索引与算法
深入讲解数据库中Decimal类型的使用以及实现方法
Mysql分库分表之后主键处理的几种方法
MySQL 开窗函数
You might like
PHP return语句的另一个作用
2014/07/30 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
详解Python编程中time模块的使用
2015/11/20 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python文本数据相似度的度量
2018/03/12 Python
Python读取properties配置文件操作示例
2018/03/29 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Python jieba库用法及实例解析
2019/11/04 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
岳庙导游词
2015/02/04 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android