mysql索引为什么使用B+树

B+树的叶子节点到底是双向链表还是单向链表 刚使用mysql的前几年,没有深入地了解mysql的内部实现,关于B+树的叶子节点的了解仅仅是:B+树的叶子节点按照自增id的大小自左至右排序,新增的元素排在右边。innodb的B+树的叶子节点是页(Page),页之间是双向链表,页内部有一个单向链表,这个单向链表是用来存储记录的。后来突然某一天在网上看到一篇文章,说B+树的叶子节点是双向链表,这让我很是疑惑,因为我一直以为B+树的叶子节点是单向链表,这篇文章是不是写错了呢?Innodb的页(Page)是存储数据的最小单位,页的大小默认为16KB。 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


mysql慢查询如何优化

`优化慢查询方法有很多,比如分库分表、提升系统硬件配置、去除不需要用的select字段。但是最常用也是最有用的方法是添加索引。

一、合理得添加索引后能给sql带来多大的速度提升?

答案是几千几万甚至几百万倍的提升。所以为什么添加索引能给慢sql带来如此巨大的速度提升。首先,索引是什么。索引是一组排好序的数据结构,用于快速查找。不用索引的时候,查询数据库中的信息时,会先将这些信息从硬盘移动到磁盘上按页读取,Innodb读取数据时一页16KB,如果一条数据是100字节,相当于一页能存储16*1024/100=160条数据。如果这张表中有10万条数据,相当于要和磁盘做625次 I/O交互。而I/O交互是很慢的。磁盘毫秒级别的时间单位比内存慢了上千倍。由上面的例子可以看到,不用索引的话,查询的速度,不仅仅和表数据量大小成反比,还和每一条数据大小成反比。速度相当得慢。

二、mysql用了什么数据结构存储索引

上面说了不用索引的话是按页一页一页去找,时间复杂度n,速度是很慢的,所以要使用索引以加快其查询速度。索引可以理解为书签,使用了索引就不用一页页去翻了。但是书签亦有优劣,所以,索引用了哪种数据结构实现了快速查找的目的。

1.为什么不用二叉树

二叉树的优势是显而易见的,二分查找时间复杂度是logn。但它存在退化问题,每次加入的数据都比上一条小,它会退化成线性结构。不巧的是,mysql又是推荐使用主键自增的,而主键自增在实际项目中也很常用,也就是说按常用的主键自增,二叉树结构的索引必然会退化,退化后时间复杂度是logn。
在这里插入图片描述

2.为什么不用红黑树

红黑树可以理解为二叉树的一个升级,红黑树的自旋操作解决了二叉树的退化问题。使得查找复杂度稳定在logn。但是二叉树一个节点只能有两个子节点。8层二叉树也仅能存255条数据。树度过高使得依然要做几十次磁盘I/O。而且一个节点只能存一条数据的设计,使得页资源巨大得浪费。因为一条数据最多也就几百byte,而一页有16KB。

在这里插入图片描述

3.为什么不用B树

B树可以理解为红黑树的一个升级。它舍弃了一个节点只能存一条数据的设定,使用了一个节点能存储多条数据。一个节点具体存储多少条数据是页大小除以一条数据大小。即,一个存储了多条数据的节点,占满整个页,不再造成页资源浪费。同时,B树也舍弃了一个节点只能有两个子节点的设定,使得它的树度远低于红黑树。那为什么最后也没有使用B树呢,主要是mysql中范围查找是非常常见的,而B树的范围查找能力并不快。B树做范围查找的话首先要定位到上界节点或下界节点,然后再做遍历,而每次遍历都要从头结点往下找,速度较慢。其次,B树在设计时数据和索引是捆绑在一起的,使得它的树度和每条数据大小成反比,这种设计使得搜索的节点在头节点会很快查询到,在叶子节点的话相对会慢一点。也就是它的查询速度不稳定。
在这里插入图片描述

4.为什么不用散列表

显而易见无序的散列表压根没法做范围查询。

5.为什么用B+树

B+树可以理解为在B树上的一个升级。B+树解决了B树范围查询过慢的问题。B+树的叶子节点由大到小排列形成了一个双向有序的链表,这条链表包含了所有索引,也就是说,除了叶子节点,其余节点都是冗余节点,这些冗余节点的作用就是为了生成由叶子节点组成的双向有序链表。有了这条链表,范围查询将非常方便。仅需定位到上界或下界节点在链表中的位置,然后向前或向后取值即可,直到超出范围,停止。
在这里插入图片描述

三、B+树和B树技术选型

由于B+树范围查找远快于B树,所以经常用到范围查询的关系型数据库更适合用B+树。那么如果是非关系型数据库呢,一般非关系型数据库不太注重范围查找。所以,B树和B+树单点查询速度,哪个更快,是接下来要阐述的问题。
B+树由于叶子节点已经包含了所有主键及主键所对应的数据,所以除了最底层的叶子节点,其他几层的节点是不包含数据的,只有主键。而一个不包含数据的节点能存多少主键呢。主键假设int型则为8字节,加上6字节的指针。而一个节点即一页的大小是16KB。16*1024/14=1170。总共能存1170个主键。第一层就一个节点能存1170个主键。第二层能有1170个节点,每个节点存1170个主键。也就是第二层能存1170乘以1170个主键。第三层如果是叶子节点包含了数据,假设数据1KB,等于一个节点包含16条数据。也就是第三层能包含1170乘以1170乘以16条数据。也就是说,三层B+树能存两千多万条数据。而每个节点都存数据的B树显然会比B+树的树度更高。但是也正是因为B树每个节点都存了数据,使得B树最快查询速度能达到O(1),当然仅限于查询的数据正好在头节点。如果是尾节点,速度是0(logn)。如果是倒数第二层,则是0(logn-1)。而B+树则是稳定的0(logn)。
所以在树度相同的情况下,B+树的查询速度和B树最慢情况下的查询速度持平,拿什么比。但是B+树非叶子节点不存数据的设定又使得在相同数据量下,B+树的高度又必然低于B树。所以两者的单点查询速度只能说不分伯仲,各有千秋。
但是,维护一条B+树更容易还是B树更容易呢。明显是B树更容易。B+树不但比B树多了很多冗余节点,还要维护最底端的双向链表。所以,对于不怎么注重条件查询的非关系型数据库,在B树和B+树单点查询速度差不多的情况下,自然是选择更易维护的B树。

总结

mysql索引底层使用B+树实现,三层的B+树可以存储两千多万数据。也就是说,两千万的数据不用索引要和磁盘做几百万次IO交互,IO交互毫秒级别使得要花费数分钟才能运行完查询内容。而用了B+树后只需IO交互三次,几毫秒就运行完成了。

mysql为什么要使用B+树作为索引 1 概述 大家可能在面试的时候都会被问到这样一个问题:mysql的索引结构是什么?这个时候了解的都知道是B+树,那么为什么会采用B+树作为它的索引结构呢? 由图可以知道:索引的存在时为了加快数据访问提高查询效率的,而数据存储在磁盘中,但从磁盘读取数据会产生大量的IO操作,读取效率是非常低的。所以在读取的时候要减少io量和减少io次数来提高读取效率。 ... 阅读详情

相关推荐

探索B树/B+树与MySQL数据库索引的关系

本文主要讲述主轴线: 由搜索/查找联系到数据结构(搜索树,红黑书,B/B+树); 进行B/B+/RBtree的性能分析; 讲述一些关于数据从内存以及磁盘读取数据的数据存储管理的内容; 对数据库引擎MyISAM和InnoDB的分析; 前言:目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,最近学习了数据结构树这一部分的内容,又阅读了前辈们关于这一话题的的总结后,斗胆运用

John的博客 1万+

Mysql

一、Mysql索引结构 1)数据结构——B+树 但是红黑树的问题是:如果数据量大了之后,树的高度就会很大。 B+数叶子节点是双向链表,父节点存放子节点的最大值。 B树与B+树的区别: 由于B+树中间节点不存指针,同样大小的磁盘页可以容纳更多的节点元素,树的高度就小。(数据量相同的情况下,B+树比B树更加“矮胖”),查找起来就更快。 B+树每次查找都必须到叶子节点才能获取数据,而B树不一定,B树可以在非叶子节点上获取数据。因此B+树查找的时间更稳定。 B+树的每一个叶子节点都有指向下一个叶子节点的

CW 2555

为什么MySQL使用B+树做索引?

本篇文从二叉查找树,详细说明了为什么mysql用B+树作为数据的索引,以及在innodb中数据库如何通过B+树索引来存储数据以及查找数据。我们一定要记住这句话:数据即索引,索引即数据。

yousuotu的博客 1187

B树,B+树

Mysql采用B+树原因 B树和B+树最重要的一个区别就是B+树只有叶子节点存放数据,其余节点用来索引。而B树的每个节点都会有data域。这就决定了B+树更适合用来存储外部数据。也就是所谓的磁盘数据。 B+树的磁盘读写代价更佳。B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小。如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也就越多。一次性读入内存中需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 B+树的查...

qq_36553387的博客 1896

ArcMap实战:用栅格计算器搞定16年NDVI趋势分析,附完整F检验流程

本文详细介绍了如何使用ArcMap的栅格计算器进行16年NDVI趋势分析,包括数据预处理、线性趋势计算和F显著性检验的全流程操作。通过实际案例和统计原理解析,帮助GIS从业者掌握植被覆盖变化的分析方法,特别适合生态评估和农业监测应用。

weixin_29251567的博客 251

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 727

数据表底层的B+树的叶子结点为啥用类似双链表连接起来

当我们在使用范围查找的时候 只要找到那个边界值就可以通过指针去查找其他所需要的数据就不用再从根结点开始遍历 减少了所消耗的时间 增加了效率 ...

weixin_38914772的博客 7046

win10下Miracast无线投屏使用教程及异常解决方案(超详细)

文章目录一、什么是Miracast?二、主流的无线投屏技术有哪些特点?三、如何查看自己的win10电脑是否支持Miracast无线投屏功能?四、win10电脑如何使用Miracast无线投屏功能? 一、什么是Miracast? Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的3C设备(如智能手机、电视、投影、电脑等...

帅气的小白的博客 44万+

MYSQL索引数据结构----B+树

我们在考虑数据结构的时候,应该首先要知道数据存放在哪里?而MYSQL的数据是持久化的,所以其数据(数据记录+索引)应该是保存在磁盘里面的。因此当我们要查询某条数据记录时,就会先从磁盘中读取索引到内存中,然后再通过内存索引数据找到该条记录在磁盘的某个位置上,最后将其读到内存中。所以查询过程中会发生多次磁盘I/O,而I/O越多耗时越长。所以,我们索引数据结构应该要尽可能少的磁盘的 I/O 操作就能完成查询工作。另外,MySQL 是支持范围查找的,所以索引的数据结构不仅要能高效地查询某一个记录,而且也要能高效地执

sanylove的博客 1913

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 485

如何编译RustDesk(Unbuntu 和Android版本)

备注:官方文档上,一边都是基于sciter,这个在后面已经不建议使用了,但是依然可以编译刚开始的时候看官方的文档,涉及的东西比较多,也搞的一头雾水,通过B站上一个视频,可以通过CI/CD来编译,以及act本地试试(最终放弃,大概需要下载大几十G的容器下来)。最终总算明确了方向,可以用自动化流水线来编译。直接看CI/CD的脚本文件文件在.github/workflows目录下,重点研究 bridge.yml 和flutter-build.yml 这两个文件。

lvronglee的专栏 2546

为什么 MySQL 采用 B+ 树作为索引?

为什么 MySQL 采用 B+ 树作为索引? 文章目录为什么 MySQL 采用 B+ 树作为索引?怎样的索引的数据结构是好的?什么是二分查找?什么是二分查找树?什么是自平衡二叉树?什么是 B 树什么是 B+ 树?1、单点查询2、插入和删除效率3、范围查询MySQL 中的 B+ 树总结结语 要解释这个问题,其实不单单要从数据结构的角度出发,还要考虑磁盘 I/O 操作次数,因为 MySQL 的数据是存储在磁盘中的嘛。 这次,就跟大家一层一层的分析这个问题,图中包含大量的动图来帮助大家理解,相信看完你就拿捏这道题

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:CSDNWF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 7881

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 382

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

本文探讨了MySQL选择B+树作为索引结构的原因。首先分析了二叉查找树(BST)可能退化为链表导致查询效率下降的问题,进而引入平衡二叉树(AVL)和红黑树,指出AVL旋转耗时、红黑树虽然性能更优但树高仍然过高的问题。特别针对磁盘存储场景,提出树高过高会导致IO次数增加,影响性能。通过对比哈希索引和二分查找的优缺点,指出二叉查找树在磁盘存储中的局限性,最终说明B+树因其矮胖特性、减少IO次数、支持范围查询等优势,成为数据库索引的理想选择。

Atticus的博客 2165

手把手教你学Simulink——基于自动驾驶辅助系统的场景实例:车道保持辅助系统(LKA)的仿真与实现

本文通过Simulink实例讲解车道保持辅助系统(LKA)的实现方法。首先介绍LKA从预警到主动控制的技术演进,阐述其系统架构、核心组件和工作原理。重点演示基于自行车模型的车辆横向动力学建模过程,以及使用线性二次调节器(LQR)设计横向控制器的详细步骤。教程包含四个仿真场景测试,分析关键指标如控制精度、舒适性和响应性。最后探讨LKA技术的发展方向,强调人机协同的安全理念。该实例为自动驾驶辅助系统开发提供了完整的Simulink实践方案。

MHD0815的博客 172

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 801

【MySQL】索引(B+树详解)

本文从索引的底层 B+树的数据构 设计出发,详细讲解了 MySQL 是如何通过索引 大幅降低查询时硬盘I/O的 原理设计实现

Brookty的博客 4116

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL之索引(2)(B树、B+树、索引分类、聚集索引、二级索引、回表查询)

本篇博客的主要内容是关于MySQL的索引中的B树、B+树索引的详细和优缺点、索引分类(主键索引、唯一索引、常规索引)、MySQL中InnoDB存储引擎中索引的存储形式(聚集索引、二级索引)、MySQL中的B+树...

岁岁岁平安的博客 1429

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MySQL: 为什么使用 B+ 树作为索引结构

MySQL索引为何选择B+树结构?本文深入分析B+树的优势及其在数据库中的应用。相比Hash、红黑树和B树,B+树具有多路搜索、叶子节点有序链表等特性,显著降低了磁盘I/O成本,高效支持范围查询和排序操作。文章通过对比表格展示B+树与其他数据结构的差异,并结合InnoDB的主键索引和二级索引设计,阐明B+树如何优化查询性能。最后通过SQL测试案例验证B+树索引的实际效果,帮助开发者理解底层原理,从而编写更高效的查询语句和索引设计。

木头 1026

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Mysql索引B树跟B+树

索引底层实现原理 数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越矮胖,磁盘IO次数就少 MySQL支持两种索引,一种的B-树索引,一种是哈希索引,大家知道,B-树和哈希表在数据查询时的效率是非常高的。这里我们主要讨论一下MySQL InnoDB存储引擎,基于B-树(但实际上MySQL采用的是B+树结构)的索引结构。 B树 B-树是一种m阶平衡树,m一般是300-500(经验值),叶子节点都在同一层,由于每一个节点存储的

Mr_Csyn的博客 2334

mysql中b树索引与b+树索引的那些事儿

MySQL主要使用B+树索引(如InnoDB引擎),它与B树在结构和性能上有显著差异。B树数据存储在所有节点,而B+树仅叶子节点存储数据,非叶子节点为索引;B+树的叶子节点通过链表连接,使其范围查询效率更高(只需遍历链表)。B+树的优势包括:更稳定的索引结构、更高的磁盘IO性能、更好的范围查询支持。MySQL选择B+树因其更适合数据库场景,特别是InnoDB引擎的高效排序和范围查询需求。相比之下,B树的查询路径不固定,范围查询效率较低。

bojinyuan00的博客 1222

为什么MySql索引使用B+树

前言 面试中我们经常碰到面试官问到数据库索引,问到索引就会问你索引的数据结构。类似这种数据结构对于普通程序员来说记住概念几天就忘了,而且概念不是每个人都能很好都理解,所以针对这一原因,我简单通俗都像大家讲解为什么mysql使用都是B+树,而不用其他的树形结构。 正文 Q1:B+树的查询时间大概多少? A:跟树的高度有关,是O(log n)。 Q2:hash查找时间大概多少? A:o(1...

晏霖/胖虎的博客 1万+

MYSQL-索引结构介绍、为什么选择B+树而不是B树

看了很多讲B树和B+树的文章,大多都是围绕各自的特性讲的,第一,树中每个结点最多含有m个孩子(m>=2);第二,……我也是从这些文章里弄懂了各种树的联系与区别,要真写,我可能还不如人家写得好。所以就在这里简明扼要的用几张图记录一下主要区别吧。 为了便于说明,我们先定义一条数据记录为一个二元组[key,data],key为记录的键值,key唯一;data为数据记录除key外的数据。 ...

z69183787的专栏 2万+

为什么 MySQL 选择使用 B+ 树作为索引结构?

MySQL选择B+树作为索引结构,是因为B+树能够在磁盘存储环境中提供高效的查询性能。它的自平衡特性、支持高效的范围查询、减少磁盘I/O操作以及能够处理大规模数据集的能力,使其成为关系数据库索引的理想选择。B+树在处理频繁的增删改查操作、提高数据访问速度以及范围查询时表现出色,这些特点都符合MySQL数据库系统的需求。高效的范围查询:B+树是一种自平衡的树结构,所有的叶子节点都在同一层,因此支持高效的范围查询。

Weiki的博客 2187

面试官:MySQL 为什么用 B+ 树实现索引

MySQL 为什么用 B+ 树实现索引索引概述常见的索引模型哈希表有序数组二叉查找树二叉查找树的查找操作二叉查找树的缺陷为什么索引不用二叉树实现InnoDB 的索引模型B 树B 树存在的问题B+ 树B 树 和 B+ 树 的区别总结 索引对大家来说肯定不会陌生,不管是日常的开发还是面试中,都少不了索引的身影。 我们都会使用索引,但是我们对于索引的原理却是一知半解。本文就带大家深入学习一下 MySQL 的索引模型。 索引概述 关于索引的定义,百度百科给出的解释是: 在关系数据库中,索引是一种单独的、物理的对数

xujunson的博客 5356

MySQL - 索引(B+树)

B+Tree原理

qq_63353796的博客 3103
上一篇: java常用线程池及它们的适用场景(JDK1.8)
下一篇: springboot自动装配是怎么实现的
efggfxfvhh
博客等级 码龄7年 351粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值