Mysql之B树

B-树

B-树(B树或B_树),这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树)
它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图。

B-树有如下特点

  • 所有键值分布在整颗树中(索引值和具体data都在每个节点里);
  • 任何一个关键字出现且只出现在一个结点中;
  • 搜索有可能在非叶子结点结束(最好情况O(1)就能找到数据);
  • 在关键字全集内做一次查找,性能逼近二分查找;

B树由来

定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。

B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。
定义只需要知道B-树允许每个节点有更多的子节点即可(多叉树)。子节点数量一般在上千,具体数量依赖外部存储器的特性。

先来看看为什么会出现B-树这类数据结构。

传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。

上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。

空间局部性原理:如果一个存储器的某个位置被访问,那么将它附近的位置也会被访问。

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884671.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Svelte 最新中文文档翻译(10)—— use: 与 Actions

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

k8s之coredns

CoreDNS CoreDNS 是一个开源的、灵活的 DNS(域名系统)服务器,它被设计为易于扩展和与微服务架构兼容。 CoreDNS 通常用于云原生环境,如 Kubernetes,负责为Kubernetes提供名称解析和服务发现。 Kubernetes集群内部pod访问Service Client pod ---> Service Name(coredns)…

如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型

本文详细介绍了零基础用户如何借助AI工具将微信公众号接入DeepSeek等大模型实现智能回复的全流程。首先通过AI问答确定开源项目chatgpt-on-wechat,利用豆包AI分析项目结构后选择Docker部署方案。重点讲解了在Ubuntu系统配置国内镜像安装Docker、编写含中文注释的docker-compos…

rust学习十八.1、RUST的OOP和简单示例

很可惜,出于一些理由,rust抛弃了OOP的核心特性之一:继承 其中一个理由应该是至关重要的,但是解释的比较模糊:继承增加了复杂性的确,继承会让rust编译器变得更加复杂。rust编译器虽然足够体贴,但是它偏慢的编译速度也是很多人所吐槽的。 在我对rust编译了解更多之前,我对…

Docker 数据卷容器-数据卷备份和还原

以下是关于 Docker 数据卷容器 的详细总结,以及如何进行 数据卷备份和还原 的说明:1. 什么是 Docker 数据卷容器? 概念:数据卷容器 是一种特殊的容器,用于存储和管理数据卷。 它的主要作用是让多个容器通过挂载同一个数据卷容器来实现 数据共享 和 独立管理。 数据卷容器的…

01 C++ 与 C 的区别 class类

描述确定一个事物,是行为(功能),而不是数据。例如:写字的,吸墨水的,笔尖是金属的。(毛笔)行为描述这个事物是钢笔。而不是黑色的等数据。 软件设计模式: 先搞清有哪些事物,联系人个人信息 C语言模块化设计与C++面向对象设计的区别:分离实体、找对象、拉关系。 分离…

机房杀(中国OIer都在玩的益智游戏)

基础牌 内卷:当作杀使用,可以在影响范围内指定一名角色产生一点伤害 刷题:当作闪使用,可以抵消掉对方内卷带来的伤害 睡觉:当作桃使用,可以恢复一滴血 切题:和内卷一起使用可以对对方造成两点伤害 技能牌 教练来了:所有玩家必须打出一张内卷,否则造成一点伤害 我是卷怪…

代码编写与实践

高质量代码编写 遵循规范:严格遵循 Java 编码规范,如 Google Java 风格指南,确保代码具有良好的可读性和可维护性。规范的代码结构有助于团队协作,也方便自己后续的代码审查和修改。 运用设计模式:学习并在项目中合理运用设计模式,如单例模式、工厂模式、观察者模式等。设…