当前位置: 首页 > news >正文

MySQL深入:B+树的演化、索引和索引结构

提示:内容是读《MySQL技术内幕:InnoDB存储引擎》,笔记摘要

文章目录

  • 二叉查找树
    • 平衡二叉树(AVL)
  • B树(BTree)
  • B+树(B+Tree)
  • InnoDB B+树索引
  • 索引结构(InnoDB B+树)
  • B+树存放的数据量


二叉查找树

在这里插入图片描述
在二叉查找树中,左子树的键值总是小于根的键值,右子树的键值总是大于根的键值,因此可以通过中序遍历得到键值的排序输出。对上图进行中序遍历(左-根-右)后输出:2、3、5、6、7、8。

平衡二叉树(AVL)

为解决二叉查找树数据左右分配不平衡,出数据大面积分布存储在根节点左侧(或右侧),查询效率低的问题,故引入平衡二叉查找树-AVL树。
平衡二叉树的定义
首先符合二叉查找树的定义; 其次必须满足任何节点的两棵子树的高度最大差为1。
平衡二叉树的缺点
平衡二叉树的查询速度的确快,但是维护一棵平衡二叉树的存储成本有很大,通常需要1次或多次左旋或右旋来得到经过插入或更新操作后二叉树的平衡性。
例如: 平衡二叉树【 1、2、4、5、9】,增加新数据节点3。
在这里插入图片描述

B树(BTree)

概念:
B树和平衡二叉树不同,B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引里大量使用者B-Tree和B+Tree的数据结构。
特点:
(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
(2)子节点数:非叶节点的子节点数范围(1,M] , 且M>=2,空树除外;
(注:M阶代表一个树节点最多有多少个查找路径,当M=3则是3叉树);
(3)关键字数Key:枝节点的关键字Key数量数据范围[ceil(M/2)-1,M-1]
(注:ceil()是个朝正无穷方向取整的函数 如3阶B树时ceil(1.5)结果为2,关键字数范围[1,2]);
(4)所有叶子节点均在同一层、叶子节点包含关键字和数据;
(5)拥有n-1个key值非叶子节点必须有n个孩子节点;
(6)一个节点的所有key值必须是升序排序的;
在这里插入图片描述BTree是单个节点可以存储多个键值和数据的多路平衡查找树
在存储海量的数据,因为平衡二叉树的每个节点只存储一个键值和数据,节点将会非常多且高度也其高,当查找数据时会进行很多次磁盘IO,查找的效率将会极低,为了解决平衡二叉树的这个弊端,需要一种单个节点可以存储多个键值和数据的平衡树(BTree)

B+树(B+Tree)

概念
B+树是B树的一个进化,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。结构如下:
在这里插入图片描述
特点:
(1)非叶子节点只存储索引(键值 + 指针 ),不存储data
(2)叶子节点存储键值和所有data,记录节点都是按键值的大小顺序存放在同一层的叶子节点,并通过指针进行链接

InnoDB B+树索引

    在MySQL数据库中,索引是在存储引擎层实现的,这意味着每个引擎的B+树索引的实现方式可能是不同的,取决于存储引擎实现的本身。
    在InnoDB存储引擎中,数据文件本身就是按照B+树方式存放数据的。其中,B+树的键值为主键,若在建立时没有显式地指定主键,则InnoDB存储引擎会自动创建一个6字节的列作为主键(rowId)。因此在InnoDB存储引擎中,可以将B+树索引分为聚集索引和辅助索引(非聚集索引)。无论是何种索引,每个页的大小都为16KB,且不能更改。
聚集索引和辅助索引的区别
聚集索引与辅助索引,底层数据结构都是B+树,区别仅在于所存放数据的内容:
聚集索引是根据主键创建的一棵B+树,叶子节点存放表中的所有记录
辅助索引(普通索引)是根据索引键创建的一棵B+树,叶子节点仅存放索引键值,以及该索引键值指向的主键
提示:如果通过辅助索引来查找数据,那么当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚集索引来得到数据,这种查找方式又被称为回表。因为辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚集索引。
在这里插入图片描述
在这里插入图片描述
回表:先通过普通索引扫描出数据所在的行(存储的是聚簇索引-主键的值,而非数据),再通过行主键值去主键(聚集)索引的叶子节点中去获取完整的数据,这样的查询等同于需要多扫描一棵索引树,这就是回表, 简单说就是基于非主键索引的查询需要多扫描一棵索引树。

如何避免回表? 可通过索引覆盖解决。在索引中包含所有需要获取的所有字段,查询结果可以直接全部拿到字段数据,不需要通过主键索引再次去获取。

索引结构(InnoDB B+树)

存储单元
磁盘:最小单元是扇区,一个扇区的大小是 512个字节
文件系统:最小单元是块,一个块的大小是 4K
InnoDB存储引擎:最小单元称之为(数据页Page),一个页的大小是16K,MySQL的InnoDB存储引擎以Data Page(数据页)作为磁盘和内存之间交互的基本单位。
B+树存储结构
mysql数据库中,table表中的表数据(记录)都是存储在页中,是以页的形式存放的,页在磁盘中不一定是连续, 且页是分布在表空间文件(.ibd文件)内,例如 user 用户表表空间文件:
在这里插入图片描述
数据页结构图在这里插入图片描述
说明:
在这里插入图片描述

B+树存放的数据量

B+树的存储总记录数 = 根节点指针数 * 单个叶子节点记录条数

假设一条的记录大小为1KB,单个叶子节点记录条数=数据页16KB/1KB = 16(条);
假设主键ID为bigint类型,长度为8字节,而指针大小为6字节,共14字节。
则一个页中可存放组合(即指针),即 1024 * 16 / 14 =1170,可以算出一棵高度为2的B+树,能存放 1170 * 16 = 1.87万,3阶的B+树能存放 1170 * 1170 * 16 = 2200万 数据记录。

相关文章:

MySQL深入:B+树的演化、索引和索引结构

提示:内容是读《MySQL技术内幕:InnoDB存储引擎》,笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构(InnoDB B树)B树存放的数据量 二叉查找树 在二叉查找树中,左子…...

axios 实现 无感刷新方案

实现思路 首次登录前端通过接口获取到两个 token;分别是 accessToken、refreshToken; accessToken:正常请求需要传递的 token ;refreshToken:当某个请求 401 ,就可以通过 refreshToken 获取到新的 accessToken 特殊场…...

Python 三种方式实现自动化任务

在这篇文章中,我们将介绍一些用Python实现机器人过程自动化的包。机器人流程自动化(Robotic process automation,简称RPA)是指将鼠标点击和键盘按压自动化的过程,即模拟人类用户的操作。RPA用于各种应用程序&#xff0…...

新型创业模式:退休创业。没有工资,不用投资,有时间就干,不强制做,赚钱按贡献分。

这种“退休创业”的创业模式具有独特的吸引力和灵活性,适合那些已退休但希望继续贡献社会价值、赚取额外收入且无需承担太多责任的群体。以下是一个详细的设计思路: 模式概述 目标人群:退休人员,具有一定技能或经验,但…...

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近,我在编译一个 Android 老项目时遇到了一个问题,错误信息显示无法找到 com.gyf.immersionba…...

在Node.js中如何使用TypeScript

第一步:创建一个Node.js项目的package.json文件 npm init -y第二步:添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步:初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…...

链表两数加python

一、问题描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…...

免费的可以薅羊毛的cloudflare反向代理教程

cloudflare-reverse-proxy 项目代码: https://github.com/EASTCATV/cloudflare-reverse-proxy 本项目是cloudflare反向代理。在cloudflare网站中新建worker,把worker.js文件中的内容复制进去即可使用。 使用方法为在任意url前面加上https://你的域名/proxy/ 即可…...

【每日刷题】Day155

【每日刷题】Day155 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCR 108. 单词接龙 - 力扣(LeetCode) 2. 675. 为高尔夫球比赛砍树 - 力扣(…...

EXCEL延迟退休公式

如图: A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…...

开源对象存储新选择:在Docker上部署MinIO并实现远程管理

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...

Spring Cloud生态圈

目录 Spring Cloud生态圈 核心组件 其他组件 总结 Spring Cloud Alibaba生态圈 核心组件 其他特性 Spring Cloud生态圈 Spring Cloud生态圈是一个为微服务架构提供全方位支持的解决方案集合。它涵盖了多个关键组件和服务,旨在帮助开发者快速构建、部署和管理…...

AI视觉小车基础--4.舵机控制(云台控制)

一、实验准备 控制连接在扩展板上的舵机。如下图所示,按键KEY1为板载元器件,所以不需要外接其他设备。 二、运行代码 # Import the Raspbot library import time from Raspbot_Lib import Raspbot from ipywidgets import interact import ipywidgets a…...

【Rust中的项目管理】

Rust中的项目管理 前言Package,Crate,Module &use ,Path通过代码示例解释 Crate,Module ,use,Path创建一个package:代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…...

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版,外加输入法、IDEA等,我想将这个虚拟机里的系统直接搬到物理机中,那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了,那直接说干就干。 本教程基于Ubuntu24.0…...

成都栩熙酷网络科技抖音小店是真的

近年来,随着短视频平台的崛起,抖音小店作为一种新兴的购物模式,迅速吸引了大量消费者和商家的关注。在这一潮流中,成都栩熙酷网络科技有限公司(以下简称“栩熙酷”)凭借其敏锐的市场洞察力和强大的技术实力…...

Python 爬虫数据清洗与存储:基础教程

Python 爬虫数据清洗与存储:基础教程 在爬虫数据获取完成后,数据往往是“原始”的,不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法,帮助新手…...

ssm122基于Java的高校教学业绩信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:高校教学业绩信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本高校教学…...

Java 基础知识

一.泛型编程 1. 泛型的概念和作用是什么? 概念:泛型(Generics)是在 JDK 5.0 引入的新特性,允许在定义类、接口和方法时使用类型参数。类型参数在使用时被具体的类型替换。作用: 类型安全性:避…...

深入探索 React Hooks:原理、用法与性能优化全解

一、引言 在现代 React 开发领域,Hooks 已成为不可或缺的一部分,赋予函数组件强大功能,使其能胜任复杂任务。本文将全面剖析 React Hooks,助您深入理解并熟练运用。 二、React Hooks 是什么 (一)Hooks 出现的背景 早期 React 主要依赖类组件,其通过this.state管理状…...

python中父类和子类继承学习

python为啥要使用继承 1. **代码复用**:子类可以继承父类的方法和属性,避免了重复编写相同的代码,提高了代码的复用性。 2. **建立层次结构**:通过继承可以清晰地表示类之间的层次关系,使代码结构更有条理。 3. **扩展…...

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习,现在进行一下小结: 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…...

华为鸿蒙HarmonyOS NEXT升级HiCar:打造未来出行新体验

随着科技的不断进步,智能出行已成为我们生活中不可或缺的一部分。华为凭借其在智能科技领域的深厚积累,推出了全新的鸿蒙HarmonyOS NEXT系统,旨在为用户打造一个“人车家”的无缝协同出行体验。这一系统的核心亮点之一,就是其内置…...

【项目组件】第三方库——websocketpp

目录 第三方协议:websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …...

计算机23级数据结构上机实验(第3-4周)

A 二叉树删除子树 编写程序对给定二叉树执行若干次删除子树操作,输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于0的整数。每次删除操作是在上一次删除操作后剩下的二叉树上执行。 输入格式: 输入第1行为一组用空格间隔的整数,表…...

【大数据学习 | HBASE高级】region split机制和策略

1. region split机制 ​ HRegionServer拆分region的步骤是,先将该region下线,然后拆分,将其子region加入到hbase:meta表中,再将他们加入到原本的HRegionServer中,最后汇报Master。 split前:hbase:meta表有…...

flink实战 -- flink SQL 实现列转行

在 SQL 任务里面经常会遇到一列转多行的需求,下面就来总结一下在 Flink SQL 里面如何实现列转行的,先来看下面的一个具体案例. 需求 原始数据格式如下: namedatatest[{"content_type":"flink","url":"111"},{"content_type&quo…...

React中右击出现自定弹窗

前言 在react中点击右键,完成阻止浏览器的默认行为,完成自定义的悬浮框(Menu菜单). 版本 "react": "^18.2.0", "umijs/route-utils": "^4.0.1", "antd": "^5.18.1", "ant-design/pro-components": &q…...

Unity类银河战士恶魔城学习总结(P128 Switch UI with KeyBoard用键盘切换UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了用键盘切换角色UI,技能树UI,合成面板UI和设置UI UI.cs 1. 变量与字段 characterUI,skill…...

基于Springboot+微信小程序的急救常识学习系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...