业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

26|B+ Tree:PostgreSQL 的索引是如何建立的?

中间节点不存数据指针
叶子节点双向链表
磁盘预读
局部性原理
多键多链
节点键数的约束条件 m/2 的由来
索引与数据的分离
索引结构的高效变动
空间换时间
节点合并
键借用
键提升
节点分裂
支持范围查询
减少磁盘IO次数
降低树的高度
B+树特点
B-树特点
适应性强于线性索引
红黑树在内存中的效率
树状索引
线性稀疏索引
思考题
删除操作
插入操作
B+树的优势
树状索引的优势
避免全表扫描
提高数据查询速度
事务处理
数据管理
数据查询
数据持久化
总结
B+树的操作
B-树和B+树
索引的数据结构
索引的必要性
数据库的作用
B+树索引

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
过去几讲我们学习了一些经典的分布式算法,主要涉及多个节点之间的协作方式,在现在的业务场景下,它们更多被封装在各种中间件或者类库中,直接供我们使用,不过背后的很多思想还是很值得好好学习体悟的。
从今天开始,我们将更加贴近日常业务开发,剖析常用中间件里用到的、单机上的一些算法,帮助自己更好地分析和优化系统性能。比如在使用数据库的时候,如果我们不清楚底层索引的原理,写出来的查询语句可能性能会很差,甚至不见得能正确建立索引;再比如有时候我们希望不引入额外的网关组件,直接在业务代码里实现一个简单的限流模块,如何设计更合适……
类似场景还有很多,话不多说,今天我们一起来了解这些中间件的秘密。

数据库

我们先从数据库聊起。数据库,应该是我们广大程序员日常开发中必不可少的组件了,作为数据持久化的基石,在互联网应用中,大部分的业务数据都以结构化的方式存储在数据库中,而数据库为我们提供了良好的数据查询、管理、持久化、事务的能力。
在数据库场景下,我们存储的都是大量的数据,显然没有办法一次性把所有的数据全部加载到内存中,用内存高效的数据结构或者算法进行搜索。那数据库是如何快速查询数据的呢?比如:
select * from student where id = 5130309492
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

B+树在数据库索引中的重要性和应用价值是本文的重点。文章首先介绍了数据库索引的作用,以及线性稀疏的索引和红黑树在内存中的应用。随后详细介绍了B-树和B+树的结构和特点,以及B+树相对于B-树的优势,包括利用磁盘预读能力和树状结构降低查询的IO次数。文章还给出了B+树的检索过程伪代码,强调了其在大数据表中进行快速检索的优势。此外,文章还讨论了B+树的插入和删除操作,以及B+树在数据库中的高效变动和存储特性。总的来说,B+树通过空间换时间的思路,为数据表建立有序索引结构,加速查询效果,特别适用于数据库中需要频繁增删改数据的场景。文章内容深入浅出,对于读者理解数据库索引和优化系统性能具有一定的参考意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 麋鹿在泛舟
    不能少于m/2实际上是和约束"不能多余m"对称的,当一个叶子节点索引个数为m个,触发了m阶B+树的分裂操作,而分裂后的两个叶子节点元素的个数应该是m/2个: * 如叶子节点最少数量比m/2还大,那么就返回分裂和合并了。 * 如叶子节点最少的数量比m/2小很多,那么会大幅度降低合并的效率,导致很多少元素叶子节点。

    作者回复: 写得很好哦~

    2022-03-06
    4
  • 那时刻
    我觉得m/2类似于二分查找里的采用二分而不是三分,更快的达到均衡。 另外一个观点是从信息论角度来看,二分的墒最大。
    2022-02-22
  • Paul Shan
    ​​个人觉得这里每个节点包含的键值至少m/2,m/3,2*m/3对于查询的量级没有影响,都是lg n,m/2实现最简单,所以被选择。m/3的实现除了实现复杂还会增加层数,也就是io访问次数,最先被排除。2*m/3能够让某些情况下层数比m/2会少一些,但是意义不大,因为选择m本身已经降低了层数,选择合适的m,层数的问题已经解决,没有必要再在因子增加新的选择,2*m/3选择会让树的调整次数增加,实现复杂度增加。请问老师实际情况是不是这样?
    2022-02-22
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部