【面试题19】B-Tree和B+Tree的区别,以及B+Tree在MySQL中的应用

news2024/9/25 7:26:09

文章目录

  • 一、前言
  • 二、关于B-Tree和B+ Tree
    • 2.1 B-Tree
    • 2.2 B+Tree
  • 三、B Tree与B+ Tree的差异
    • 3.1 叶子节点的差异
    • 3.2 数据访问的差异
    • 3.3 范围查询的差异
  • 四、Mysql中B+Tree的应用场景
    • 4.1 主键索引
    • 4.2 唯一索引
    • 4.3 普通索引
  • 五、MySQL为什么使用B+Tree来做索引?
  • 总结


一、前言

本文已收录于PHP全栈系列专栏:PHP面试专区。
计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列,欢迎大家提前关注锁定。

二、关于B-Tree和B+ Tree

2.1 B-Tree

在这里插入图片描述
B-Tree是一种平衡树,它的定义比较简单,每一个节点都有m个子节点,每个节点从小到大排列,对于一个含有n个关键字的B Tree,可以分为logm(n)层,根节点也算一层,所以高度最多是logm(n),这保证了B Tree的查找效率。

2.2 B+Tree

在这里插入图片描述
B+ Tree也是一种平衡树,与B Tree不同的是,B+ Tree在叶子节点上存放所有关键字,内部节点只存放关键字的索引。这样做优点在于:

  1. 内部节点的关键字比叶子节点少,可以让节点变得更小,一块磁盘能够存储的节点数量更多;
  2. 叶子节点形成一个有序链表,方便进行范围查询。

三、B Tree与B+ Tree的差异

3.1 叶子节点的差异

B Tree与B+ Tree的最大区别在于叶子节点存放的内容:B Tree的叶子节点既存放关键字索引,也存放数据;而B+ Tree的叶子节点只存放关键字和指向数据的指针。

3.2 数据访问的差异

B Tree和B+ Tree的索引实现原理相似,都是通过比较关键字大小进行节点的递归查找,不同之处在于,B Tree查找到目标关键字后就可以直接返回数据,而B+ Tree则需要通过叶子节点的指针再次访问磁盘才能返回数据。

3.3 范围查询的差异

B+ Tree天生自带范围查询优势,因为叶子节点形成的链表是有序的。而B Tree则需要进行全局遍历,效率较低。

四、Mysql中B+Tree的应用场景

Mysql中的索引是基于B+ Tree实现的,所以B+ Tree适用于Mysql中所有的索引,包括主键索引、唯一索引和普通索引等。

4.1 主键索引

主键索引是一个表中的主键或唯一索引,它可以用来保证表中每一行都具有唯一性。在Mysql中,如果没有主键或唯一索引,那么InnoDB存储引擎会默认生成一个6字节的ROWID作为主键。在Mysql中,主键索引是B+ Tree结构,它对于数据插入和修改的操作非常高效,同时也可以用来加速关联查询。

4.2 唯一索引

唯一索引是与主键索引类似的结构,它可以保证表中某一列或多列的唯一性,如果插入的数据违反了唯一性约束,则会触发错误。唯一索引与主键索引的区别在于,唯一索引允许null值。

4.3 普通索引

普通索引是最常用的索引类型,它可以加速查询某一列的操作。在Mysql中,普通索引也是B+ Tree结构,可以加速等值查询、范围查询和排序操作。

五、MySQL为什么使用B+Tree来做索引?

通过上面的对比,应该知道B-Tree和B+Tree的区别了。MySQL为什么要用B+Tree来做索引可以看下面的解释。
在这里插入图片描述

总结

总之,B+ Tree是一种适用于磁盘存储的平衡树,由于在磁盘上读写数据的时间比在内存中读写数据慢,因此B+ Tree能够更好地适应磁盘存储,提高数据的读写效率。在Mysql中,B+ Tree被广泛应用于索引的实现,保证了数据库查询的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】IP地址定位技术的应用场景

随着科技的不断发展,网络空间已经成为人们生活中重要的一部分。而其中,IP地址定位技术又是网络空间不可或缺的一部分。IP地址定位技术是一种可以根据IP地址确定用户位置的技术这项技术不仅可以用于个人定位,也可以使用在商业领域、网络安全和…

【新星计划·2023】认识和学习BASH(一)

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、认识BASH 1、硬件、核心与Shell ①硬件 ②核心管理 ③应用程序 2、为何要学文字接口的shell? 3、系统的合法shel…

学习AQS

面试的时候被问到AQS会不会一脸懵逼呢?今天来学习一下AQS吧! 看看这个听起来高大上又难以回答的东西到底是个啥? 1.什么是AQS JUC包中 的很多同步器如ReentrantLock、Semaphore、CountDownLatch等等都是有一些基础的共同的行为,比如:等待队列、条件队列、独占获取、共享…

IntelliJ IDEA - IDEA 如何快速生成 serialVersionUID?

问题描述 今天遇到序列化问题的时候,需要用到 serialVersionUID 字段,如下。但是不知道如何快速自动生成这个,于是有了这篇博客,哈哈哈 private static final long serialVersionUID 6828716364537510652L; 解决方案 首先如图…

STM32F系列项目定时器配置-中断触发源详解

1.以高级定时器为例: 2.触发源选择与极性选择: 3.触发源介绍 (282条消息) 【STM32技巧】(1)STM32定时器8种触发源之ITR0~ITR3说明_stm32 定时器触发定时器_小石头有大内涵的博客-CSDN博客 ITR0内部触发0ITR1内部触发1ITR2内部触…

为什么ECB模式不安全\链接模式【密码学】(6)

目录 一、链接模式 二、ECB模式 三、链接模式缺失带来什么问题 一、链接模式 之前讲过,链接模式就是将是一个分组运算和下一个分组运算联系起来。 上一个分组运算的所有结果都有可能参与到下一个分组运算中;下一个分组运算的每一个要素&#xff0c…

Unity3d_shader_Transparency(解决透明材质物体重叠穿透问题)

解决两个透明材质物体穿透问题 【Unity】半透明なオブジェクトを綺麗に表示するシェーダを導入する - コガネブログ https://github.com/ewersp/Shaders https://github.com/ewersp/Shaders/blob/master/BetterTransparentDiffuse.shader // An improvement to the default …

Java --- springboot3整合kafka

一、消息队列场景 1.1、异步 1.2、解耦 1.3、削峰 1.4、缓冲 二、springboot整合kafka 导入pom依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency> 修改配置 spring.…

CSS基础学习--21 img ( 图片 )

一、使用 CSS 创建图片廊 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>CSS基础学习-图片</title> <style> div.img {margin: 5px;border: 1px solid #ccc;float: left;width: 180px; }div.img:hover…

【系统架构】软件架构技术发展路线概览

发展主线&#xff1a; 模块化编程/面向对象编程构件技术面向服务开发技术云技术 注&#xff1a;点击查看大图 任何新技术、新方向和新思路的出现都会融入软件架构的发展历程中。

排序算法——冒泡排序

冒泡排序 算法步骤 以升序排序为例&#xff1a; 比较相邻元素&#xff0c;如果前面的比后面的元素大&#xff0c;则两元素交换位置对每一对相邻元素进行比较&#xff0c;大的放后&#xff0c;这样最后的元素将是最大的元素对越来越少的混乱元素重复上述步骤&#xff08;最后…

OpenCV——《bitwise_and》mask的操作以及直方图的操作

1.bitwise_and和mask操作 bitwise_and该函数是一个and操作当两者全为1的时候才会为1&#xff0c;有0则0. import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name,img):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() maskmask np.zer…

【Java】JVM学习(一)

JVM是一种规范 Java程序的执行过程 一个 Java 程序&#xff0c;首先经过 javac 编译成 .class 文件&#xff0c;然后 JVM 将其加载到方法区&#xff0c;执行引擎将会执行这些字节码。执行时&#xff0c;会翻译成操作系统相关的函数。JVM 作为 .class 文件的翻译存在&#xff…

bash: fork: Cannot allocate memory

bash: fork: Cannot allocate memory 将 echo 1000000 > /proc/sys/kernel/pid_max 命令用于修改 /proc/sys/kernel/pid_max 文件&#xff0c;这将更改系统中进程ID&#xff08;PID&#xff09;的最大值。 进程ID是操作系统为每个正在运行的进程分配的唯一标识符。pid_max…

python torch 训练 qt.qpa.plugin: Could not load the Qt platform plugin “xcb“的解决方法

详细问题描述 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this prob…

chatgpt赋能python:Python编程入门指南:Python花钱吗?

Python编程入门指南&#xff1a;Python花钱吗&#xff1f; Python是一个开源、免费的编程语言&#xff0c;当然&#xff0c;这是大家最常听到的关于Python的优点之一。但也有些开发者在使用Python时&#xff0c;会遇到一些需要花费资金的情况。那么&#xff0c;Python到底花钱…

python基础学习10【哑变量处理、离散化(等宽法、等频法、基于聚类分析的方法)、fit()、聚类模型评价指标、 分类模型评价指标、ROC曲线】

哑变量处理 特点&#xff1a;对于一个类别型特征&#xff0c;若其取值有m个&#xff0c;则经过哑变量处理后就变成了m个二元特征&#xff0c;并且这些特征互斥&#xff0c;每次只有一个激活&#xff0c;这使得数据变得稀疏。 get_dummise()函数&#xff1a; pd.get_dummies(…

Ubuntu20.04安装ros系统,使用dvs_ros软件包

Ubuntu20.04安装ros系统 确保Ubuntu系统已经更新配置好合适的软件源 添加ros软件源&#xff1a; sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest…

2023省赛-运维-溯源取证-日志分析

2023省赛-运维-溯源取证-日志分析 一、概要 1、标题&#xff1a;日志分析 2、关键字&#xff1a;access.log日志分析 3、比赛&#xff1a;2023省赛 4、工具&#xff1a;awk、cat 二、开始 1、题目分析 apache或nginx的access.log分析。使用最多的就是awk命令和cat命令。 其…

Java中==和equals的区别,包装类对比、String和new String

对于这个问题&#xff0c;我们得了解基本类型和引用类型在内存中的结构&#xff0c;具体如下&#xff1a; 引用对象句柄访问&#xff1a; 引用对象直接指针访问&#xff1a; 可以看出&#xff0c;无论哪种方式访问基本类型和引用类型的实例数据&#xff0c;基本类型的内存上是…