一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的


Posted in MySQL onMay 25, 2021

这一篇笔记我们简述一下

  • MySQL的B+Tree索引到底是咋回事?
  • 聚簇索引索引到底是如何长高的。

一点一点看,其实蛮好理解的。

如果你看过了我之前的笔记,你肯定知道了MySQL进行CRUD是在内存中进行的,也就是在Buffer Pool中。然后你也知道了当内存中没有MySQL需要的数据时,MySQL会从Disk中通过IO操作将数据读入内存中。读取的单位呢就是:数据页

一般数据页长下面这样

一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的

没错,数据页中存储着真实的数据,而且数据页在内存中是以双向联表的方式组织起来的!如下图

一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的

而在B+Tree的设定中,它要求主键索引时递增的,也就是说如果主键索引时递增的话,那么就要求右侧的数据页中的所有数据均比左侧数据页中的数据大。但是很明显上图并不符合,因此需要通过页分裂来调整成下面这样。

一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的

好,现在你回想一下,之前你肯定有听说过:MySQL的B+Tree聚簇索引,只有叶子节点才存储真实的数据,而非叶子节点中存储的是索引数据,而且叶子节点之间是通过双向链表连接起来

没错,那所有的B+Tree的叶子节点就是上图中的数据页,并且它们确实是通过双向链表关联起来的!

我们接着往下看,如果只看上图由数据页连接起来的双向链表的话,这时如果我们检索id=7的数据行,那会发生什么?

很明显我们要从头开始扫描!

那你可能会问:方才不是说B+Tree要求主键是递增的嘛?并且有页分裂机制保证右边的数据页中的所有数据均比它左边的数据页的索引值大。那进行二分查找不行嘛?

答:是的,确实可以在单个数据页中进行二分查找,但是数据页之间的组织关系是链表呀,所以从头开始遍历是避免不了的。

那MySQL怎么办的呢?

如下图:MySQL针对诸多的数据页抽象出了一个索引目录

一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的

那有了这个索引目录我们再在诸多的数据页中检索时看起来就容易多了!直接就拥有了二分检索的能力!

而且这个所以目录其实也是存在于数据页中的,不同于叶子节点的是,它里面知识存储了索引信息,而叶子节点中存储的是真实数据?

而索引页的诞生也就意味着B+Tree的雏形已经诞生了!

随着用户不断的select,buffer pool中的数据页的越来越多,那么索引页中的数据也会水涨船高。当现有的索引体量超过16KB(一个数据页的容量)时就不得不搞一个新的索引页来存储新的索引信息。这时这颗B+Tree就会慢慢变得越来越胖。

那你也知道B+Tree是B树的变种,而B树其实可以是2-3树、2-3-4数....等等M阶树的泛称,当每个节点中能存储的元素达到上限后,树就会长高(上一篇文章有讲过)。

就像下图这样:

一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的

以上就是一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的的详细内容,更多关于MySQL聚簇索引的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL 覆盖索引的优点
May 19 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL事务的隔离级别详情
Jul 15 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 #MySQL
Mysql 用户权限管理实现
May 25 #MySQL
MySQL 查询速度慢的原因
May 25 #MySQL
MySQL 全文索引使用指南
May 25 #MySQL
52条SQL语句教你性能优化
May 25 #MySQL
简单了解 MySQL 中相关的锁
mysql在项目中怎么选事务隔离级别
You might like
浅谈php提交form表单
2015/07/01 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
JS实现密码框效果
2020/09/10 Javascript
Python常用的爬虫技巧总结
2016/03/28 Python
python中hashlib模块用法示例
2017/10/30 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
Django实现分页显示效果
2019/10/31 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
捐助贫困学生倡议书
2014/05/16 职场文书
质检员岗位职责
2015/02/03 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js
win10清理dns缓存
2022/04/19 数码科技