一文了解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 07 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
MySQL优化及索引解析
Mar 17 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
教你如何让spark sql写mysql的时候支持update操作
Feb 15 #MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 #MySQL
Mysql Innodb存储引擎之索引与算法
深入讲解数据库中Decimal类型的使用以及实现方法
Mysql分库分表之后主键处理的几种方法
MySQL 开窗函数
You might like
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
JS原型链怎么理解
2016/06/27 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python绘制彩虹图
2019/12/16 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
构造方法和其他方法的区别
2016/04/26 面试题
深圳茁壮笔试题
2015/05/28 面试题
学校门卫岗位职责
2014/03/16 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
学雷锋日活动总结
2015/02/06 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
Java 关于String字符串原理上的问题
2022/04/07 Java/Android