一文了解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 数据丢失排查案例
May 08 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL中日期型单行函数代码详解
Jun 21 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
SQL基础的查询语句
Nov 11 MySQL
mysql 子查询的使用
Apr 28 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
教你如何让spark sql写mysql的时候支持update操作
Feb 15 #MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 #MySQL
Mysql Innodb存储引擎之索引与算法
深入讲解数据库中Decimal类型的使用以及实现方法
Mysql分库分表之后主键处理的几种方法
MySQL 开窗函数
You might like
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
javascript常见用法总结
2014/05/22 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
Python3实现从指定路径查找文件的方法
2015/05/22 Python
python函数装饰器用法实例详解
2015/06/04 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python实现三维拟合的方法
2018/12/29 Python
python实现图片压缩代码实例
2019/08/12 Python
pandas 对group进行聚合的例子
2019/12/27 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
python在地图上画比例的实例详解
2020/11/13 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
Java语言的优势
2015/01/10 面试题
毕业求职自荐信格式是什么
2013/11/19 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript