索引(B+树)、B+树一个节点有多大?(一千万条数据,B+树多高?)

开门见山的问MySQL:InnoDB一棵B+树可以存放多少行数据?你如何作答? 前言 开门见山,面对这样一个问题,你将如何作答? 1千万,2千万,或者上亿条数据?具体的答案不重要,当然肯定也不会是一个固定的数目,今天我们就一起来探讨探讨这个问题。 InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎,它拥有诸多功能和特性,体系结构和工作原理也比较复杂。真要讲明白说透彻,不是一两篇博文能够实现的,也不是今天的重点。 所以,本文不涉及太多的原理性知识,咱们就针对开头提出的问题,... 阅读详情

1. 谈谈对索引的理解

  • 索引是存储引擎用于提高数据查询效率的一种数据结构,索引类似于字典里的目录。Mysql中的索引是在存储引擎层实现的,索引的数据结构和存储引擎有关,在MySQL中使用较多的索引有 Hash 索引、B树索引和 B+ 树索引。

    • hash索引:底层就是 hash 表。进行查找时,根据 key 调用hash 函数获得对应的 hashcode,根据 hashcode 找到对应的数据行地址,根据地址拿到对应的数据。
    • B树索引:B树是一种多路搜索树,n 路搜索树代表每个节点最多有 n 个子节点。每个节点存储 key + 指向下一层节点的指针+ 指向 key 数据记录的地址。查找时,从根结点向下进行查找,直到找到对应的key。
    • B+树索引:B+树是b树的变种,主要区别在于:B+树的非叶子节点只存储 key + 指向下一层节点的指针,也就是只存索引,不存数据,数据都保存在叶子节点中。另外,B+树的叶子节点之间通过指针来连接,构成一个有序链表,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。
  • 索引有三个优点: ①减少了服务器需要扫描的数据量;②帮助服务器避免排序;③将随机IO变为顺序IO,因为 B+ 树索引是有序的,它将相邻的数据都存储在一起。

  • 索引的缺点:创建索引和维护索引会耗费时间;索引会占用物理空间;当对表进行增删改时,索引也需要动态维护,这样会降低数据的维护速度。一般在频繁使用或需要排序的字段上建立索引,而对于很少查询或重复值较多的列,不适合建立索引。、、

(InnoDB 中使用了 B+ 树索引,它先通过 B+ 树找到数据所在的页,然后将页读到内存,在内存中找到要查找的数据。Mysql 将索引存放在磁盘而不是内存中,减少了内存消耗)

2. B树和B+树的区别?为什么使用B+树?(B+树底层文件是怎么存储的)

  • B+树的中间节点存的是索引,不存储数据,数据都保存在叶子节点中,而B树的所有节点都能存放数据。所以B+树 磁盘读写的代价比B树低,因为中间节点不放数据,所以相同的磁盘块能存放更多的节点,一次性读入内存的节点数量也就越多,所以IO读写次数就降低了。
  • B+树的叶子节点位于同一层,数据也都位于叶子节点中,所以每次查找都是从根节点找到叶子节点,效率很稳定。而B树在查到关键字后就停止查找了,效率不够稳定。
  • B+树的叶子节点还按照大小,通过链表有序的串联在一起,在进行遍历查询时,只需要遍历这个链表即可,而且还支持范围查询,查到范围的开始节点,然后往后遍历即可实现。而B树没有这样的链表,只能通过中序遍历来查找数据,不支持范围查询。

3. MySQL为什么要用B+树存储索引?而不用平衡二叉树(红黑树)、Hash索引(散列表)、B树、跳表?

  • Hash索引(散列表):如果只查询单个值的话,hash 索引的效率非常高,时间复杂度为O(1)。但是 hash 索引有几个问题:1)不支持范围查询;2)不支持索引值的排序操作;3)不支持联合索引的最左匹配规则。
  • 平衡二叉树(红黑树):查询性能也好,时间复杂度O(logn),中序遍历可以得到一个从小到大有序的数据序列,但不支持区间查找。而且由于是二叉树,当数据量很大时树的层数就会很高,从树的根结点向下寻找的过程,每读1个节点,都相当于一次IO操作,因此他的I/O操作会比B+树多的多。
  • B树索引:见上面B树和B+树的区别↑。
  • 跳表:是一种链表加多层索引的结构,时间复杂度O(logn),支持区间查找,而B+树是一种多叉树,可以让每个节点大小等于操作系统每次读取页的大小,从而使读取节点时只需要进行一次IO即可。而且同数量级的数据,跳表索引的高度会比 B+ 树的高,导致 IO 读取次数多,影响查询性能。

4. B+树一个节点有多大?一千万条数据,B+树多高?

  • B+树一个节点的大小设为一页或页的倍数最为合适。因为如果一个节点的大小 < 1页,那么读取这个节点的时候其实读取的还是一页,这样就造成了资源的浪费。
  • 在 MySQL 中 B+ 树的一个节点大小为“1页”,也就是16k。之所以设置为一页,是因为对于大部分业务,一页就足够了:
    • 首先InnoDB的B+树中,非叶子节点存的是key + 指针;叶子节点存的是数据行。
    • 对于叶子节点,如果一行数据大小为1k,那么一页就能存16条数据;对于非叶子节点,如果key使用的是bigint,则为8字节,指针在mysql中为6字节,一共是14字节,则16k能存放 16 * 1024 / 14 = 1170 个索引指针。于是可以算出,对于一颗高度为2的B+树,根节点存储索引指针节点,那么它有1170个叶子节点存储数据,每个叶子节点可以存储16条数据,一共 1170 x 16 = 18720 条数据。而对于高度为3的B+树,就可以存放 1170 x 1170 x 16 = 21902400 条数据(两千多万条数据),也就是对于两千多万条的数据,我们只需要高度为3的B+树就可以完成,通过主键查询只需要3次IO操作就能查到对应数据。所以在 InnoDB 中B+树高度一般为3层时,就能满足千万级的数据存储,所以一个节点为1页,也就是16k是比较合理的。
彻底搞懂MySql的B+Tree 官方定义:一种能为mysql提高查询效率的数据结构,索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如,一本书,你想找到自己想看的章节内容,直接查询目录就行。这里的目录就类似索引的意思。1.1索引的工作原理转存失败重新上传取消如上图中,如果现在有一条sql语句 select * from user where id = 40,如果没有索引的条件下,我们要找到这条记录,我们就需要在数据中进行全表扫描,匹配id = 40的数据。如果有了索引,我们就可以通过索引进行快速查找,如上图中,可以先在 阅读详情

相关推荐

你的mysql到底能存多少数据呢?

mysql存储多少数据

zwjzone的博客 1万+

抛开数据结构,InnoDB中B+树究竟存的是什么

文章目录提出问题数据页数据页的组成User RecordUser Record的特点Page Directory多个数据页之间的关系存储目录信息的数据页索引聚簇索引特点二级索引特点唯一索引联合索引番外话 提出问题 InnoDB中B+树各个节点存储的内容是什么? InnoDB中索引的种类有哪些?它们节点存储的内容各自有什么区别? 数据页 InnoDB中页是内存和磁盘交互的基本单位, 默认是16KB。其中存储用户记录的页被称为数据页,也被称为索引页。 数据页的组成 其中我们重点关注的就是 User R

inconspicuousy-start 3082

滴滴秋储后端实习生面经+秋招正式批ssp面经

滴滴秋储实习生面经以及滴滴秋招正式批面经+ssp攻略

薛定谔的Hello Kitty 1825

MySQL聚集索引与非聚集索引

聚集索引与非聚集索引 参考链接: http://blog.sina.com.cn/s/blog_d13b2a8f0102wlj8.html http://jingyan.baidu.com/article/e73e26c0f1e82d24acb6a75d.html http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html h...

weixin_30559481的博客 215

MySQL高频基本面试问题整理

总结大厂MySQL高频基本面试问题整理,用于快速查缺补漏

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 564

【mysql为什么采用b+树作为索引】

而对于高度为3的B+树,就可以存放 1170 x 1170 x 16 = 21902400 条数据(两千多万条数据),也就是对于两千多万条的数据,我们只需要高度为3的B+树就可以完成,通过主键查询只需要3次IO操作就能查到对应数据。:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。叶子节点存的是数据行。

m0_50116974的博客 1120

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2124

MySQL用B+树(而不是其他数据结构)做索引的原因

B树 特点: 1、多路排序树 2、内部节点也存data B+树: 特点: 1、多路排序树 2、内部节点不存data,只有叶子节点才存data 3、叶子节点左右相连,形成一条有序的双向循环链表 为什么MySQL选择B+树做索引 1、 B+树的磁盘IO读写次数低:每次读写一个树节点就是一次IO,B+树的内部节点并没有存data,因此盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。 2、B+树的查询效率更加稳定:由于内部结点并不是最终指向文件

weixin_45429720的博客 1187

从零开始安装pytorch(包含GPU和CPU版本的安装)

Pytorch是。

qiaoxinyu1989的博客 8万+

Vivado工程备份实战:两种方法快速迁移Block Design(附路径避坑指南)

本文详细介绍了Vivado工程中Block Design(BD)备份与迁移的两种核心方法:文件夹直接复制法与TCL脚本生成法。针对FPGA工程师在项目迁移或团队协作时常见的IP丢失、路径报错等问题,提供了从原理到实战的操作指南与路径避坑策略,确保设计可复现与高效协作。

pz890123的博客 1287

MySQL有哪些索引?为什么用B+树?B+树高度如何计算?

转载自: https://blog.csdn.net/dl674756321/article/details/102987984 目录 谈谈对索引的理解 B+树高度计算 谈对索引的理解 索引是存储引擎用于提高数据查询效率的一种数据结构,索引类似于字典里的目录。Mysql中的索引是在存储引擎层实现的,索引的数据结构和存储引擎有关,在MySQL中使用较多的索引有 Hash 索引、B树索引和 B+ 树索引。 hash索引:底层就是 hash 表。进行查找时,根据 key 调用hash 函数获得对应的

进击的Coder*的博客 1385

JSBSim开发手册:飞机仿真模型开发指南

JSBSim是一款开源的飞行动力学模型仿真引擎,支持多种飞行器的仿真,包括固定翼飞机、直升机、无人机等。JSBSim的设计目标是提供一个灵活、高效、精确的飞行动力学仿真环境。飞行动力学仿真:实现飞行器的动力学仿真,包括空气动力学、发动机、质量和惯性等模型。控制系统仿真:实现飞行器的控制系统仿真,包括自动驾驶仪、飞控系统等。环境仿真:模拟飞行环境,包括大气模型、风力模型等。本文详细介绍了如何使用C++进行JSBSim开发,包括系统设计、模型实现、代码优化和性能调优等方面的内容。

qq_38334677的博客 4512

大厂面试八股文——数据库mysql

文章目录手撕mysql命令非关系型数据库和关系型数据库区别,优势比较?什么是临时表,临时表什么时候删除?什么是sql注入,怎么防止SQL注入mysql集群,集群出现延迟如何解决mysql几种日志数据库高并发的解决方案优化 sql 语句的一般步骤索引的底层实现sql 查询语句确定创建哪种类型的索引,如何优化查询B树与二叉树的对比MySQL B+Tree 索引和 Hash 索引的区别?Hash 索引B+Tree 索引为什么用B+树,为什么不用红黑树和B树B树和B+树的区别B+树一个节点有多大?一千万条数据,B+

xiaohu的博客 5354

ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

1、符号化显示: CAD数据加载进来有很多列表,包含了点【point】、线【polyline】、面【polygon】、标注数据【Annotation】等数据,本次实验我们需要用到的是面数据,也就是.dwgPolygong格式的数据。如下图所示: 把数据加载进来,然后在2处打开属性表,查看CAD数据的属性表,打开后可以发现【layer】图层表示就是地块的用地性质,它就是符号化显示的依据。 我们在数据上右键【属性】,打开图层属性,找到【符号系统】,选择类别中的【唯一值】,然后在【值字段】下拉选择【layer】,

yuanYW7556的博客 2万+

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2572

面试官:MySQL表中有2千万条数据,B+树层高是多少?

本节以一道经典的面试题,引出了 MySQL 中 InnoDB 的存储结构。理解了这个存储结构,就可以很好的理解索引和数据查找原理了。

zjj2006的专栏 526

华为MetaERP在财务模块(GL/AP/AR/FA)及子账模块效率优化、月末关账加速、与外部系统对账方面,已形成一套**“并行+实时+智能化”**的完整技术方案

华为MetaERP推出"并行+实时+智能化"技术方案,显著提升财务模块效率:1)采用三级并行策略和内存计算,使子账模块单任务处理时间从142分钟降至9分钟;2)通过并行关账架构将月末关账时间从68小时压缩至7.2小时;3)运用AI智能对账提升效率50%,并支持异步流程和区块链审计。典型场景测试显示月结耗时下降89%,CPU利用率提升116%。方案建议分阶段实施,注意依赖分析、任务粒度设计和性能监控,避免过度并行。该方案已有效解决大型集团财务处理效率低、关账慢、对账难等痛点。

金牌架构师 553

MySQL的三层B+树能存多少数据?

第一层(根节点):1个非叶子页,能存1170个索引项 → 能指向1170个第二层的页;第二层(中间非叶子节点):1170个非叶子页,每个页又能存1170个索引项 → 能指向个第三层的叶子页;第三层(叶子节点):每个叶子页能存16行数据。1170 × 1170 × 16 ≈ 2190万条所以,三层B+树大约能存2000万条记录。

博客 239

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mysql索引结构树高度_MYSQL的B+Tree索引树高度如何计算

前一段被问到一个平时没有关注到有关于MYSQL索引相关的问题点,被问到一个表有3000万记录,假如有一列占8位字节的字段,根据这一列建索引的话索引树的高度是多少?这一问当时就被问蒙了,平时这也只关注MySQL索引一般都是都是用B+Tree来存储维护索引的,还有一些复合索引的最左匹配原则等等,还真没有实际关注过始即然用到索引能提升查询的效率,那么这个索引树高是多少,给定表和索引字段后怎么计算出索引树...

weixin_35915120的博客 1598

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2021-4-21

Queue 中 add() 和 offer() 区别 Java实现二叉树的层序遍历 mysql锁机制有哪些_MySQL锁机制——你想知道的都在这了! volatile的可见性原理 索引(B+树)、B+树一个节点有多大?(一千万条数据,B+树多高?) ...

qq_20156289的博客 186

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL索引-B+树

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。 索引在 MySQL 数据库中分三类: B+ 树索引 Hash 索引 全文索引 我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构。

jmlqqs的博客 1529

一文带你了解MySQL之B+树索引的使用

上边只是我们在创建和使用B+树索引的过程中需要注意的一些点,后边我们还会陆续介绍更多的优化方法和注意事项,敬请期待。B+树索引在空间和时间上都有代价,所以没事别瞎建索引B+树索引适⽤于下边这些情况:全值匹配匹配左边的列匹配范围值精确匹配某⼀列并范围匹配另外⼀列用于排序用于分组在使用索引时需要注意下边这些事项:只为用于搜索、排序或分组的列创建索引为列的基数⼤的列创建索引索引列的类型尽量小可以只对字符串值的前缀建立索引。

Multis 1992

如何计算B+树的高度呢

一个千万量级别,且存储引擎是MyISAM或者InnoDB的表,其索引树的高度在3-5之间。 B+树的索引树的高度就是logNB(logN/logB) N表示记录数,B表示每个节点有B个索引。 假设有3000W条数据,每个节点保存64个索引。 那么索引的高度就是(log2^25)/log64=25/6=4 ...

weixin_46248981的博客 3383

B+树叶子结点到底存储了什么?

首先MYSQL默认InnoDB引擎,该引擎默认B+树;先说结论:B+树叶子结点存储的是主键KEY或者具体数据。分情况讨论: 主键KEY 比如说user_name是个索引,当执行该SQL:select * from user_info where `user_name` = 'xiaoming';InnoDB 就会建立 user_name 索引 B+树,节点里存的是 user_name 这个 ...

Alice_8899的博客 1万+

mysql b tree 节点数_MySQL索引-(B-Tree和B+Tree学习)

B-treeB树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O。平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有节点的情况。B树是解决这个问题的很好的结构B...

weixin_33669766的博客 409
上一篇: Java8实战
下一篇: 数组和链表(单双链表)的时间复杂度
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值