B-Tree / B+Tree 结构以及MySQL索引

影响MySQL索引B+树高度的是什么? 提到MySQL,想必大多后端同学都不会陌生,提到B+树,想必还是有很大部分都知道InnoDB引擎的索引实现,利用了B+树的数据结构。 那InnoDB 的一棵B+树可以存放多少行数据?它又有多高呢? 到底是哪些因素会对此造成影响呢,今天我们就来展开聊一下。 阅读详情

对MySQL的索引相关的问题以前一直很不清楚,最近了解了下树和索引之间的关系,对这方面有了新的认识,感觉豁然开朗,留下一些笔记。

  • B-树

B-树不一定是二叉树,B树是一种平衡树,它的高度是固定的;
B树是一种多路查找树,也就是说它的节点上有多个存储的值;

BTree每个节点存储的数据量很大,可以算一算,每个节点的数据如果为100个,层高M为3,则总的数据量,将近似为:(1000+1)^3 - 1;这将超过10亿个。
然而,最多只需要3次磁盘IO就能读取到需要的数据到内存中。
相比于二叉树,它的优势在于它在查找的时候,每次能排除更多的无效数据,如果我们只需要查找一个数,二叉树每次只能排除1/2的无效数据,而上面提到的那棵BTree每次能排除1000/10001的数据。

BTree牺牲的是内存存储和计算,用此来换取更少的磁盘IO次数。
定义规则:
一棵M阶(M>=3)的B树,是一棵平衡的M路搜索树。它或者是空树,或者是满足下列性质的树:
1、根节点至少有两个子女;
2、每个非根节点所包含的关键字个数满足:[M/2 -1, M-1];(如果M为3,则每个非根节点上的关键字为[0,2],最多两个)
3、每个非根节点的出度正好是关键字总数+1 ;也就是说,3个关键字,将会有4个孩子,这3个关键字正好是4个孩子持有关键字的分界线;如图所示,这是一颗B+树的一部分:
这里写图片描述
关键字:30和40,将他们的三个子节点分为3段,每段都是按顺序排列的

4、所有的叶子都位于同一层;
5、每个节点的关键字都是按从小到大的顺序排列,

可以认为每个节点的所有数据都是一个连续的磁盘块,因为它是一次从磁盘中读取的,
每个节点有两部分数据:关键字 + 子节点指针;
每个节点的关键字个数是可以不一致的,只要满足条件就可以;

BTree的插入操作:
1、查找这个插入的数据是否已经存在,如果存在,则返回;
2、如果不存在,则将数据放在节点的顺序排列位置;
3、如果放置数据的节点的关键字个数已经满了,就将中间位置的数据往父节点的关键字部分添加;
4、如果父节点的关键字个数已经满了,就重复步骤3;

因为约束了根节点最少2个子节点,意思就是说根节点至少有一个关键字,树的高度不会变化;

- B+树
B+树是B树的一种变体,也是一种多路搜索树,它有如下更多的约束:
1、非叶子节点的子树指针与关键字个数相同;
2、非叶子节点的子树指针P[X],指向关键字属于[k[X],k[i+1])的子树;
3、只有叶子节点的关键字才是真正的数据
4、所有叶子节点都有一个链指针;
5、所有叶子节点都在同一层;
这里写图片描述(只是一部分)

  • 应用
    B树和B+树经常被运用到数据库中,作为MySQL的数据库索引。
    首先需要明确,索引是用来快速定位目标数据的;
    一个简单的SQL:select name from t_a where id = 20;
    首先从from语句开始解析,准备数据,从t_a表中取出id = 20的数据;然后再从数据中选择name字段;

如果id字段没有增加索引,就需要从开始到最后全部读出来,然后判断id是不是20,直到找到为止;
如果id字段增加了索引,则就会从承载索引的那颗B+树中找到id=20的节点,而后再定位到表数据;
哪种方式快?
不言而喻,第二种方式当然会比第一种要快,因为B+树的查找比起线性表,是快很多的;

关于MySQL的索引:
1、当定义一个主键时,MySQL的存储引擎把它当做一个聚集索引;
2、如果没有定义主键,则MySQL定位到第一个唯一索引,且该索引的所有列值均为非空的,则将其当做聚集索引;
3、如果没有主键或者适合做唯一索引,MySQL会生成一个隐藏的行ID值(6字节);
4、一个表中除了聚集索引,定义的都是辅助索引,也称为二级索引。

MySql的两套引擎,MyISAM和InnoDB,他们对索引的处理,有些差异;
MyISAM:
这里写图片描述
B+树叶子节点存储的是数据行的起始地址; 索引和数据是分开存的;
InnoDB 主索引:
这里写图片描述
InnoDB的数据和索引是放一起的;但是它的辅助索引,也是如此;所以MySQL的.ibd文件中,存储了表数据和索引信息;
了解完上面这些之后,一些关于InnoDB索引的问题,就有些眉目了:
1、一次查询只能用到一个索引;
因为索引是分开存的,不同的索引对应不同的数据;

2、尽量使用区分度高的列作为索引;
这很明显,区分度高,更有利于在树中的查找;

3、索引列不能参与计算;
索引列中保存的是表中的字段值,如果进行查找时还需要先把字段进行计算,开销太大;所以索引列做了函数操作之后,是不会走索引的;not、<>、!=亦是如此;

4、为什么索引越多,插入更新操作越慢?
索引越多,B+树越多,维护起来越费劲;

-EOF-

MySQL系列—索引相关的数据结构和算法(B+Tree) MySQL目前提供了以下4种索引。 B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。 HASH 索引:只有Memory引擎支持,使用场景简单。 R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。 Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引,InnoDB从MYSQL5.6版本提供对全文 阅读详情

相关推荐

卫星载荷应用方案

本文将从技术和应用层面探讨卫星载荷的应用方案,分析各个领域的特点和挑战,以期为卫星载荷的应用提供一定的指导和参考。卫星载荷应用方案涵盖了通信、地球观测、气象预报、导航定位等诸多领域在每一个领域中,都存在着不同的技术挑战和应用需求。随着技术的进步和需求的变化,卫星载荷应用方案将不断发展和完善,为人类社会的进步和发展做出更大的贡献。用户可以通过接收多颗卫星的信号,计算自身的位置和速度信息。在覆盖扩展方面,可以采用多星座、MEO、GEO 等不同轨道高度的卫星布局,结合卫星的特点和应用需求,实现覆盖范围的扩展。

muyangjun的专栏 904

从B 树、B+ 树、B* 树谈到R 树

出处:http://blog.youkuaiyun.com/v_JULY_v 。   第一节、B树、B+树、B*树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查

ggxxkkll的专栏 4738

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大致流程。 2. 卡尔曼滤波(Kalman filter) 目标跟踪中使用的就是最基础的 Kalman filter 算法。这里也仅仅讨论最基础的 Kalman filter 算法。 卡尔曼滤波算法的过程很简单,如下图所示。最核心的两个步骤就是预测和更新(下图的 correct)。 在目标跟踪任务中,目标的

生命在于折腾! 2万+

B-Tree和B+Tree详解

B-Tree详解 B-Tree由来 我们前面已经了解了平衡二叉查找树,如果100w条数据放入到二叉查找树中,假设树的高度为n,则2^0+2^1+2^2+2^3...+2^(n-1)=(2^n)-1=1000000,计算出来n为20,因此查找100w条数据中的一个数据时最多需要查询20次即可。如果是在内存操作的话,查询效率还是蛮高的,但是数据库中的数据都是存放在磁盘上的,每读取一个节点就需要一次...

大龙的博客 2543

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

【工业级视觉实战】海康威视SDK + Python + YOLOv11:零延迟目标追踪系统落地指南

要在 Python 中调用海康 DLL,首先得把 C++ 的结构体 1:1 翻译过来。这是很多开发者踩坑最深的地方(指针错误、内存溢出)。import sys# 根据操作系统加载库else:# 定义设备信息结构体 (对应 C++ LPNET_DVR_DEVICEINFO_V30)("sSerialNumber", ctypes.c_byte * 48), # 序列号("byAlarmInPortNum", ctypes.c_byte), # 报警输入个数。

BUG猿的博客 227

校招——数据库

b树和b+树 外键 数据库攻击及应对/sql注入/Dos攻击 数据库中锁的类型 共享锁/排他锁 乐观锁/悲观锁 数据库删除语句,速度 truncate/delete/drop 事务的特性 ACID mysql主从复制 数据库优化方案 mysql查询过程 外连接/内连接 drop和delete区别;修改一个字段名 取出所有学生中80分以上的,逆序输出 按班级输出80分以上的 说说视图(数据安全、查询快、建立要消耗) 能直接修改视图吗? 两个表的内连接 左连接 右连接输出结果的区

Lovezyn971221的博客 489

YOLOv8改进 | 融合篇,YOLOv8主干改进融合网络之MobileNetV3+CA注意机制,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。YOLOv8中的主干网络替换成MobileNetV3+引入CA注意机制

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1882

B树、B+树、哈夫曼树

由一圈一圈组成,数据存储在磁道中,磁道又由组成,磁颗粒分N极和S极。:磁盘上有磁头,磁头上有线圈,线圈如果通电,其电流方向不同会使磁头磁极不同(电生磁),根据同极相斥、异极相吸的原理会使磁颗粒N/S极发生改变,磁颗粒磁极的两种分布情况分别代表0、1,实现数据存储。1.2 数据读取磁头上线圈不带电,磁颗粒周围存在磁感线,磁头划过时,磁颗粒的磁极不同,产生的磁感线不同,磁头产生的电流方向不同(磁生电),通过感应电流装置读取电流变化,读出0、1数据。

m0_74154813的博客 1986

使用YOLOv5进行工业检测(如裂纹、划痕、破损等)

本文将详细介绍如何使用YOLOv5实现工业检测项目,以检测生产线上的缺陷产品,如裂纹、划痕、破损等。我们将分步介绍数据准备、模型训练、模型优化和部署等过程。

a871923942的博客 2528

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5190

MySQL索引原理及B-Tree / B+Tree结构详解

MySQL索引原理及B-Tree / B+Tree结构详解 目录 摘要 数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序访问指针的B+Tree 为什么使用B-Tree(B+Tree) 主存存取原理 磁盘存取原理 局部性原理与磁盘预读 B-/+Tree索引的性能分析 MySQL索引实现 MyISAM索引实现 Inno...

最怕一生碌碌无为,还安慰自己平凡可贵 2万+

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

MySQL索引原理及BTree(B-/ Tree)结构详解

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为三个部分。 第...

uiuan00的专栏 748

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

理解mysql索引背后的数据结构B~Tree(B-Tree/B+Tree)

B-Tree在不同的文献中的定义略显不同,所以在我初学B-Tree的时候非常困惑,知乎的一篇回答解答了我的困惑为什么 B-tree 在不同著作中度的定义有一定差别? - oldsharp的回答 - 知乎 ,本文将以算法导论中的定义来对B-Tree展开讨论。正文在《算法导论》和《计算机程序设计艺术》一书中中对B-Tree的度的定义有略微的不同,在《算法导论》中定义了一个「最小度数t」表示「半满」状态

FoolFox 1338

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MySQL 为什么采用 B+ Tree 作为索引结构?

MySQL 为什么采用 B+ Tree 作为索引结构?

m0_46671240的博客 932

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MYSQL 索引与数据结构笔记

MySQL 索引与数据结构笔记主要探讨了 B-Tree 和 B+ Tree 的差异及其在数据库中的应用。B-Tree 每个节点存储键和数据,适合单点查询,而 B+ Tree 非叶子节点仅存储键,数据集中在叶子节点,并通过链表连接,适合范围查询和减少磁盘 I/O。B+ Tree 的高扇出和低树高使其在数据库索引中表现更优,尤其适合大量数据和高并发读写场景。MySQL 的 InnoDB 存储引擎默认使用 B+ Tree 作为索引结构,因其能有效减少磁盘 I/O、优化范围查询并提高页面利用率。文章还通过示例展示了

m0_62895602的博客 905

b+tree数据结构可视化_由 B-/B+树看 MySQL索引结构

B-树B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.B-树有如下特点:所有键值分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;在关键字全集内做一次查找,性能逼近二分查找;B+ 树B+树是B-树的变体,也是一种多路搜索树, 它与 ...

weixin_39564831的博客 96

mysql索引的子部分_MySQL索引背后的数据结构及算法原理

MySQL索引背后的数据结构及算法原理数据结构及算法基础索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search)...

weixin_39799307的博客 2134

b+tree数据结构可视化_由 B-/B+树看 MySQL索引结构【转载】

B-树B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.B-树有如下特点:所有键值分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;在关键字全集内做一次查找,性能逼近二分查找;B+ 树B+树是B-树的变体,也是一种多路搜索树, 它与...

weixin_29775447的博客 194

浅谈B+Tree的演化以及在MySQL索引中的应用

对索引的简单理解 之前在学习索引的时候,就在思考为什么通过索引查询会减少查询的时间,解决查询时可能一直存在的效率问题(偶尔效率慢可能是因为锁表或者脏页等问题)。后来主要去研究了MySQL底层索引的实现原理,即对B+Tree结构的使用。 一般来说从数据库查询数据是内存对磁盘进行I/O操作的过程,而对磁盘读取的次数往往决定了查询速度的快慢。因此索引的目的就是更好优化存储结构,从而使用空间换取时间的方法增加查询的效率。当然如果创建了糟糕的索引不仅不会加快查询的效率,反而增加不必要的储存消耗。 B+Tree的演化

大松哈哈哈的博客 364

MySql之索引

尽管 B+树找到一个记录所需的比较次数要比 B-树多,但是一次磁盘访问的时间相当于成百上千次内存比较的时间,因此实际中B+树的性能可能还会好些,而且 B+树的叶子节点使用指针连接在一起,方便顺序遍历(例如查看一个目录下的所有文件,一个表中的所有记录等),这也是很多数据库和文件系统使用 B+树的缘故。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

weixin_51089557的博客 889

B+Tree原理及mysql的索引分析

转载:http://www.cnblogs.com/xiaoxi/p/6894610.html点击打开链接一、索引的本质&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。...

XiaodunLP的博客 240

mysql 树形查询效率_Mysql一棵树原理以及索引优化

B+Tree原理及mysql的索引分析一、索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为...

weixin_31178795的博客 1281

【MySql】——B-/+Tree索引原理剖析

一、什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 常见的索引: 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕。 hash索引无法满足范围查找。 二叉树、红黑树 [复杂度O(h)]导致树高度非常高(平衡二叉树一个节点只能有左子树和右子树),逻辑上很近的节点...

我爱吃土豆 7653

mysql索引结构树高度_MySQL索引结构之B+树索引(面)

MyISAM 和 InnoDB 存储引擎,都使用 B+Tree的数据结构,它相对与 B-Tree结构,所有的数据都存放在叶子节点上,且把叶子节点通过指针连接到一起,形成了一条数据链表,以加快相邻数据的检索效率。一、先了解下 B-Tree 和 B+Tree 的区别1、B-TreeB-Tree是为磁盘等外存储设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于...

weixin_34725745的博客 512
上一篇: Spring MVC源码分析 - 请求和参数
下一篇: Spring Boot初体验
闰六月
博客等级 码龄11年 16粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值