一文了解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 8.0 之不可见列的基本操作
May 20 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
DQL数据查询语句使用示例
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
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python3实现多线程聊天室
2018/12/12 Python
python构造函数init实例方法解析
2020/01/19 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
科级干部考察材料
2014/02/15 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
支部书记四风对照材料
2014/08/28 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
教师个人师德总结
2015/02/06 职场文书
地道战观后感500字
2015/06/04 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
PHP策略模式写法
2021/04/01 PHP
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
零基础学java之循环语句的使用
2022/04/10 Java/Android