一看就懂的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 INSERT INTO语句
May 26 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
mysql序号rownum行号实现方式
Dec 24 MySQL
mysql数据库如何转移到oracle
Dec 24 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
中专毕业生的自我鉴定
2013/12/01 职场文书
培训心得体会
2013/12/29 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
小学班主任事迹材料
2014/12/17 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
主题班会开场白
2015/06/01 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
Python max函数中key的用法及原理解析
2021/06/26 Python