一文了解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 infobright的安装步骤
Apr 07 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 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数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
flexigrid 参数说明
2010/11/23 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
js图片上传的封装代码
2017/08/01 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python滑块验证码的破解实现
2019/11/10 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
美术专业学生个人自我评价
2013/09/19 职场文书
网站美工岗位职责
2014/04/02 职场文书
锦旗标语大全
2014/06/23 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
运动会100米加油稿
2015/07/21 职场文书