热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

B+树的正确姿势

背景用过MySQL的同学都知道高效查询需要走索引,否则全表读取会导致慢SQL。InnoDB的索引是采用B+树实现的。网络和书本上关于B+树的定义各不相同,读者们可能都分辨不清哪个是

背景

用过MySQL的同学都知道高效查询需要走索引,否则全表读取会导致慢SQL。InnoDB的索引是采用B+树实现的。网络和书本上关于B+树的定义各不相同,读者们可能都分辨不清哪个是准确的定义。

定义

笔者按照《数据库系统概念》(Database System Concepts)这本书上的概念,准确定义B+树

B+树采用的是平衡树结构,从根节点到每个叶子节点的路劲长度都是相同的,我们给每棵树定义nn是固定不变的,下图是B+树节点全满状态的结构:

《B+树的正确姿势》
P表示指针,K表示关键字,且如果i ,则Ki j(假设没有重复的关键字)。

对于叶节点,i = 1,2,···,n-1, 指针Pi指向具有关键字Ki的一条文件记录,指针Pn指向后一个叶节点,这样所有的叶节点按键值大小顺序串成一个链表,可以高效地进行顺序处理。

非叶节点的结构与叶节点相同,只不过非叶节点的指针都是指向树中的节点。假设有Ki-1,Pi,Ki,则指针Pi指向的子树中的关键字值大于等于Ki-1,小于KiP1指向的子树的关键字值,小于K1Pn指向的子树的关键字值都大于等于Kn-1

  • 对任意节点,指针数 = 关键字数 + 1

  • 对于任意非叶节点,其指针数必须满足[ceil(n/2), n]

  • 若非叶节点是根节点,则其指针数可以小于ceil(n/2),但至少包含两个指针,除非整棵树只有一个节点

  • 对于任意叶节点,其关键字数必须满足[ceil((n-1)/2), n-1]

  • 若叶节点是根节点,则其关键字数可以小于ceil((n-1)/2)

更新

关于B+树的查找、插入、删除操作,请参考本人github

https://github.com/butterflyl…

原文链接

https://segmentfault.com/a/11…


推荐阅读
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • SQL 数据恢复技巧:利用快照实现高效恢复
    本文详细介绍了如何在 SQL 中通过数据库快照实现数据恢复,包括快照的创建、使用及恢复过程,旨在帮助读者深入了解这一技术并有效应用于实际场景。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 利用Git GUI将本地项目同步至GitHub的方法
    GitHub作为开发者不可或缺的工具,不仅提供了丰富的开源项目资源,还极大地便利了个人项目的管理和版本控制。本文将详细介绍如何使用Git GUI工具将本地开发的项目上传至GitHub。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
author-avatar
周七2602930253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有