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

 更新时间:2021年05月25日 14:32:43   作者:返回主页赐我白日梦  
聚簇索引不是一种单独的索引类型,而是一种数据存储方式。innodb的聚簇索引实际上在同一个结构中保存了B-tree索引和数据行。通过本文学习MySQL的聚簇索引及聚簇索引是如何长高的,感兴趣的朋友一起学习下吧

这一篇笔记我们简述一下

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

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

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

一般数据页长下面这样

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

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

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

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

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

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

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

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

那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 约束下的查询功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • MySQL数据库线上修改表结构的方法

    MySQL数据库线上修改表结构的方法

    MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用,这篇文章主要介绍了MySQL数据库线上修改表结构的方法,需要的朋友可以参考下
    2022-09-09
  • MySQL Join算法原理解析

    MySQL Join算法原理解析

    本文详细介绍了MySQL中常见的四种JOIN算法:嵌套循环连接(NLJ)、索引嵌套循环连接(INLJ)、块嵌套循环连接(BNLJ)和基于哈希的连接(HashJoin),每种算法都有其适用场景和性能特点,感兴趣的朋友一起看看吧
    2025-02-02
  • 微信公众平台开发 数据库操作

    微信公众平台开发 数据库操作

    这篇文章主要介绍了微信公众平台开发 数据库操作的相关资料,需要的朋友可以参考下
    2016-10-10
  • MYSQL定时清除备份数据的具体操作

    MYSQL定时清除备份数据的具体操作

    这篇文章主要给大家介绍了关于MYSQL定时清除备份数据的具体操作,文中通过示例代码介绍的非常详细,对大家学习或者使用MYSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现

    MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现

    这篇文章主要介绍了MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现,事务A 按照查询条件读取某个范围的记录,其他事务又在该范围内出入了满足条件的新记录,当事务A再次读取数据到时候我们发现多了满足记录的条数
    2022-07-07
  • 经测试最好用的mysql密码忘记的解决方法

    经测试最好用的mysql密码忘记的解决方法

    经测试最好用的mysql密码忘记的解决方法...
    2007-06-06
  • Fedora环境下装MySQL命令方法介绍

    Fedora环境下装MySQL命令方法介绍

    刚刚涉及mysql如果有不对的地方,请大家指正,希望自己的一点点经验,能够帮到大家
    2012-11-11
  • MySQL9.0.1安装教程的实现示例

    MySQL9.0.1安装教程的实现示例

    本文主要介绍了MySQL软件的下载、解压、环境变量配置、初始化及启动、登录与密码设置等步骤,详细说明了每一步的操作方法,感兴趣的可以了解一下
    2024-10-10
  • 基于mysql replication的问题总结

    基于mysql replication的问题总结

    本篇文章是对mysql中replication的问题进行了详细分析介绍,需要的朋友参考下
    2013-06-06

最新评论