一文了解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 26 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
MySQL系列之五 视图、存储函数、存储过程、触发器
Jul 02 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL数据库查询之多表查询总结
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
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
详解Python中的Descriptor描述符类
2016/06/14 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
python 实现图片批量压缩的示例
2020/12/18 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
人资专员岗位职责
2014/04/04 职场文书
应用心理学专业求职信
2014/08/04 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
python办公自动化之excel的操作
2021/05/23 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang