前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速查询的秘籍—B+树索引上

快速查询的秘籍—B+树索引上

作者头像
热心的大肚皮
发布2023-02-28 13:54:56
2640
发布2023-02-28 13:54:56
举报
文章被收录于专栏:程序猿日常笔记

大家好,我是热心的大肚皮,皮哥。前段时间和多位大佬讨论过,是聊聊实操还是聊聊八股文呢,一千个读者就会有一千个哈姆雷特,皮哥最后认真思考了下初衷,不知道大家有没有这样的痛点,在学习时或者实操时,找不到成体系的讲解文章,只能从头看书寻找,这样学习效率低下,所以皮哥决定,由浅入深,先学原理,在来实操,正所谓,先学武功,后来退敌。不多说,开整。

如何查询页中数据?

先来回顾下前行、页存储。如下图所示。

细节不过多赘述了,感兴趣的同学,可以看看前几篇文章。

  • 在一个页中查询 根据主键查询:则根据页目录通过二分法快速查询。 根据其他列查询:从infimum记录开始遍历查询,然后进行记录对比是否符合要求。
  • 多个页查询 根据主键查找:从第一个页开始,遍历每个页采用二分法查找。 根据其他列查询:从第一个页开始,继而从infimum记录开始遍历查询,然后进行记录对比是否符合要求。

在使用中肯定是多个页的场景居多,那么有没有快速的查询办法呢?当然有,就是索引。

索引如何提效的呢?

有同学还记得我们在讲页中记录存储的时候,其中属性record_type与min_rec_flag是什么含义吗?大家想不到也别回去查了,这个属性会在聊索引的时候讲,也就是现在。

  • record_type 0:普通的用户记录 1:目录项记录(过会会讲) 2:Infimum记录 3:Supremum记录
  • min_rec_flag 1:目录项纪录 2:普通用户记录

回到正题,如果提高查询效率呢?思路与页中的目录项一样,采用二分法查询,只不过是新增一个页,给所有的页做个目录,这个目录只包含两个信息。

  • key

页中用户记录中最小的主键值。

  • 页号

用page_no 表示。

如果数据记录极多呢?如下图。

那如果记录继续增多呢?如下图。

看到这里,大家有没有眼熟,倒过来看像不像颗树,上面是树根,下面是树叶,这是一种数据结构,就是B+树。真正的数据都是存在最底层,也就是叶子节点,其余存目录项纪录的叫做非叶子节点。

之前聊的页的Page Header中有个PAGE_LEVEL的属性,它代表这个叶作为节点在B+树中的层级。

叶分裂

多补充个知识点,我们工作中经常听到叶分裂,那么什么是叶分裂呢?

第一步,如下图,页1中有1、3、7三条记录,这时候添加了记录5,由于页1空间已满,存入页5中,但是不满足下一个页的最小主键记录要大于上一个页的最小记录。

第二步,将页5中的记录5与页1中的记录7进行位置互换。

这个过程就叫做叶分裂。

下篇会聊聊聚簇索引、二级索引、联合索引等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿日常笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档