一文了解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 25 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 MySQL
MySQL深分页问题解决思路
Dec 24 MySQL
关于MySQL中explain工具的使用
May 08 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的配置文件php.ini
2006/10/09 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
python实现爬虫下载美女图片
2015/07/14 Python
Python中内建函数的简单用法说明
2016/05/05 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
keras中的backend.clip用法
2020/05/22 Python
Python如何执行系统命令
2020/09/23 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
大学新生欢迎词
2014/01/10 职场文书
安全生产月演讲稿
2014/05/09 职场文书
大学生找工作求职信
2014/07/09 职场文书
2014年保密工作总结
2014/11/22 职场文书
社区义诊通知
2015/04/24 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
对公司的意见和建议
2015/06/04 职场文书
会议营销主持词
2015/07/03 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技