响应式商品展示的网站源码/郑州整站关键词搜索排名技术
1.B-Tree的原理分析
(1)什么是B-Tree
-
B-树,全称是 Balanced Tree,是一种多路平衡查找树。
-
一个节点包括多个key (数量看业务),具有M阶的B树,每个节点最多有M-1个Key。
-
节点的key元素个数就是指这个节点能够存储几个数据。
-
每个节点最多有m个子节点,最少有M/2个子节点,其中M>2。
-
数据集合分布在整个树里面,叶子节点和非叶子节点都存储数据;类似在整个树里面做一次二分查找。
-
B 树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data)。
-
实际业务中B树的阶数一般大于100,存储大量数据,B树高度也会很低,查询效率会更高。
-
备注
-
每个节点拥有最多的子节点,子节点的个数一般称为阶。
-
阶:m阶是代表每个节点最多有m个分支(子树)。
-
树的度:这棵树里面节点最大的度。
-
节点的度:当前节点有几个子节点。
-
(2)B树插入原理
- 每个节点的数据都是顺序存储,具有M阶的B树,树的阶数表示每个结点最多可以有多少个子结点
(3)B树的应用场景
- 在数据库中,B树用来维护索引,用来提高查询效率,一个节点可以存储整个页(即磁盘块)
- 在文件系统中,B树用来存储文件的目录信息,提高文件的访问效率
- 在操作系统中,B树可以用来存储内存管理信息,提高内存的分配效率
(4)思考:3层的B树,阶数为1024,最多容纳多少个元素?
-
B树的阶数表示每个结点最多可以有多少个子结点,因此B树的阶数为1024,表示每个结点最多可以有1024个子结点
-
由于B树的3层,因此根结点可以有1024个子结点,每个子结点又可以有1024个子结点
-
因此一个3层的B树,阶数为1024,B树的每一层的节点数都是阶数的幂次方
-
计算总容量 把每一层的节点数相加 即10241+10242+1024^3 大约是 11亿个节点,假如每个节点放一个元素就是11亿个
-
所以在10亿个数据中找目标值,常规小于3次磁盘IO即可找到目标值,比平衡二叉树的30次提升了不少
-
平衡二叉树的高度就等于每次查询数据时磁盘 IO 操作的次数。
-
10亿的数据量,log2(N)约等于30次磁盘IO,
- log2(N) 相当于2的多少次方(立方)等于N,例:log2 (8)= 3
- 2的30次方=1073741824,所以就是30次磁盘IO
-
2.B+Tree的原理分析
(1)什么是B+Tree
- 是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,同等存储空间下比B-Tree存储更多key
- 非叶子节点不对关键字记录的指针进行保存,只进行数据索引 , 树的层级会更少 , 所有叶子节点都在同一层,
- 叶子节点的关键字从小到大有序排列,叶子节点之间用指针连接, 构成有序链表(稠密索引)
- B+树上每个非叶子节点之间是一个双向链表进行链接,而叶子节点中的数据都是使用单向链表链接
- 查找特点
- 当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找
- 继续沿着关键字的指针向下,每次查询必须到叶子节点才能真正获取到相关数据
- B+Tree叶子节点相连接,对树的遍历就是只需要 一次线性遍历叶子节点
- 由于叶子节点的数据是顺序排列,方便区间查找
- 在B+树完成范围查找,排序查找,分组查找,去重查找 比B树效率也比较高
(2)B+Tree插入流程解析
-
总结
-
B树和B+树的最大区别在于非叶子节点是否存储数据
-
B+树非叶子节点只是当索引使用,同等空间下B+树存储更多key
-
B树,非叶子节点和叶子节点都会存储数据,找到对应节点就有对应的数据
-
B+树, 只有叶子节点才会存储数据,存储的数据都是在一行上,找到非叶子节点的key,还需要继续找到叶子节点才可以获取数据
-
B树的节点包括了key-value,所以找到对应的key即可找到对应的value,不用在继续寻找
-
两种树各有优缺点和应用场景
-
3.B+Tree树应用之Mysql索引底层原理剖析
-
背景
-
Mysql数据库是大家用最多的,查询是最高频使用的操作
-
在多数数据库的设计里面,会用B-Tree或B+Tree做索引提高查询效率
-
-
基于一张数据库的表数据进行查询(类似mysql的user表)
-
构建索引:id用做key,然后data是数据的存储地址
内存地址 | id | phone | name | Age |
---|---|---|---|---|
0xFS | 843 | 13820835467 | 张三 | 43 |
0xER | 984 | 15738235423 | 李四 | 20 |
0x32 | 4212 | 12152354223 | 王五 | 18 |
0x93 | 1000 | 12152356324 | 赵六 | 30 |
0xAP | 2341 | 18735622097 | 李祥 | 19 |
0xSQ | … 1千万条数据 | … | … | … |
-
精确查找 id=2341的数据
select * from user where id = 2341
-
未使用索引
- 自上而下查找数据,一行行遍历,5次才找到数据
-
使用索引
- id建立主键索引(B+Tree结构),对应的数据存储数据的地址,2次找到数据,且数据量越多效果越明显
- 根节点是常驻内存的,不需要进行IO操作
-
-
范围查找 id>1000 和 id < 4212 的用户
-
未使用索引
- 自上而下查找数据,一行行遍历
-
使用索引
- id建立主键索引(B+Tree结构),由于本身是有序链表,所以顺序查找即可
-
-
Mysql的InnoDB中的索引结构与MyISAM的索引结构的区别
-
InnoDB引擎,表数据文件按B+Tree组织的,叶节点data域保存完整行数据, 树上的key就是主键, 以主键构建的B+树索引
-
这种索引叫做聚集索引(聚簇索引 clustered index)
-
聚簇索引一般为主键索引,而主键一个表中只能有一个,所以聚集索引一个表只能有一个
-
聚簇索引叶子节点存储的是行数据,而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)
-
-
MyISAM引擎:索引文件和数据文件是分开的,索引结构的叶子节点放的是指向数据的主键(或者是地址)构建的B+树索引
- 这种索引叫做非聚集索引、二级索引、辅助索引(非聚簇索引 nonclustered index)
- 非聚集索引一个表可以存在多个
- 叶子节点中保存的不是实际数据,而是主键,获得主键值后去聚簇索引中获得数据行
-
注意
-
非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID或记录的地址
-
当使用非聚簇索引进行查询时,会得到一个主键 ID,再使用主键 ID 去聚簇索引上找真正的行数据,把这个过程称之为回表查询
-
所以聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引
-
非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID或记录的地址
-
当使用非聚簇索引进行查询时,会得到一个主键 ID,再使用主键 ID 去聚簇索引上找真正的行数据,把这个过程称之为回表查询
-
所以聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引
-
相关文章:

MySQL底层存储B-Tree和B+Tree原理分析
1.B-Tree的原理分析 (1)什么是B-Tree B-树,全称是 Balanced Tree,是一种多路平衡查找树。 一个节点包括多个key (数量看业务),具有M阶的B树,每个节点最多有M-1个Key。 节点的key元素个数就是指这个节点能…...

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目
本文是专栏《手把手带你做一套毕业设计毕业设计》的实战第一篇,将从Vue脚手架安装开始,逐步带你搭建起一套管理系统所需的架构。当然,在默认安装完成之后,会对文件目录进行初步的细化拆分,以便后续功能迭代和维护所用。…...

第十三章:Java反射机制
第十三章:Java反射机制 13.1:Java反射机制概述 Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 加…...

iLok USB不识别怎么办?
我的iLok USB坏了吗? 我的iLok USB没有被系统或软件识别。 如果您的iLok USB未被识别,问题可能出在iLok USB、iLok软件或受保护的软件。 提示如果您使用USB集线器,请确保您使用正确的集线器电源适配器。排除硬件:将iLok USB直接插…...

【LeetCode与《代码随想录》】二叉树篇:做题笔记与总结-JavaScript版
文章目录代码随想录144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102.二叉树的层序遍历226.翻转二叉树101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数110.平衡二叉树257. 二叉树的所有路径404.左叶子之和513.找树左下角…...

机器人运动|浅谈Time Elastic Band算法
前言在自主移动机器人路径规划的学习与开发过程中,我接触到Time Elastic Band算法,并将该算法应用于实际机器人,用于机器人的局部路径规划。在此期间,我也阅读了部分论文、官方文档以及多位大佬的文章,在此对各位大佬的…...

【Linux】网络基础(1)
前言 相信没有网络就没有现在丰富的世界。本篇笔记记录我在Linux系统下学习网络基础部分知识,从关于网络的各种概念和关系开始讲起,逐步架构起对网络的认识,对网络编程相关的认知。 我的上一篇Linux文章呀~ 【Linux】网络套接字编程_柒海啦的…...

限流算法详解
限流是我们经常会碰到的东西,顾名思义就是限制流量。它能保证我们的系统不会被突然的流量打爆,保证系统的稳定运行。像我们生活中,地铁就会有很多护栏,弯弯绕绕的,这个就是一种限流。像我们抢茅台,肯定大部…...

Spark/Hive
Spark/HiveHive 原理Spark with HiveSparkSession Hive Metastorespark-sql CLI Hive MetastoreBeeline Spark Thrift ServerHive on SparkHive 擅长元数据管理Spark 擅长高效的分布式计算 Spark Hive 集成 : Hive on Spark : Hive 用 Spark 作为底层的计算引擎时Spark w…...

HashMap底层的实现原理(JDK8)
目录一、知识点回顾二、HashMap 的 put() 和 get() 的实现2.1 map.put(k, v) 实现原理2.2 map.get(k) 实现原理三、HashMap 的常见面试题3.1 为何随机增删、查询效率都很高?3.2 为什么放在 HashMap 集合 key 部分的元素需要重写 equals 方法?3.3 HashMap 的 key 为…...

操作系统-整理
进程 介绍 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大&#…...

系统换行符的思考
各系统换行符 换行符,也即是回车换行,因为表示为Carriage-Return和Line-Feed。 回车用Return-Carrige表示,简写为CR,字符表示为\r。 换行用Line-Feed表示,简写为LF,字符表示为\n。 由于历史原因…...

Wwise集成到unreal
1、Wwise集成到Unreal 1.1 安装必要的软件 安装unreal 5.1;安装Audiokinetic Launcher;集成版本是Wwise 2021.1.12.7973。Audiokinetic Launcher下载地址: https://www.audiokinetic.com/zh/thank-you/launcher/windows/?refdownload&pl…...

前端秘籍之=>八股文经卷=>(原生Js篇)【持续更新中...】
大家好,最近想了想,打算总结归纳一版前端八股文经卷,给大家提供学习参考,如果帮助到大家,请大家,一键三连支持一下,你们的支持会激励我更加努力的更新更多有用的知识,博主先在这里谢…...

【Python安装配置教程】
Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台…...

Spring-Retry失败重试
文章目录 重试的场景引入依赖启动类serviceController@Retryable参数@Recover注意事项重试的场景 1、网络波动需要,导致请求失败,需要重发。 2、发送消息失败,需要重发,重发失败要记录日志 … 引入依赖 <!-- spring-retry--> <dependency><groupId>or…...

【目标检测 DETR】通俗理解 End-to-End Object Detection with Transformers,值得一品。
文章目录DETR1. 亮点工作1.1 E to E1.2 self-attention1.3 引入位置嵌入向量1.4 消除了候选框生成阶段2. Set Prediction2.1 N个对象2.2 Hungarian algorithm3. 实例剖析4. 代码4.1 配置文件4.1.1 数据集的类别数4.1.2 训练集和验证集的路径4.1.3 图片的大小4.1.4 训练时的批量…...

项目ER图和资料
常用的数据类型 模型类 一对多 from app import db import datetimeclass BaseModel(db.Model):__abstract__ Truecreate_time db.Column(db.DateTime,defaultdatetime.datetime.now())update_time db.Column(db.DateTime,defaultdatetime.datetime.now())class Role(db.M…...

剑指 Offer 20. 表示数值的字符串(java+python)
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分: 若干空格 一个 小数 或者 整数 (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数…...

程序员的逆向思维
前要: 为什么你读不懂面试官提问的真实意图,导致很难把问题回答到面试官心坎上? 为什么在面试结束时,你只知道问薪资待遇,不知道如何高质量反问? 作为一名程序员,思维和技能是我们职场生涯中最重要的两个方面。有时候…...

吐血整理学习方法,2年多功能测试成功进阶自动化测试,月薪23k+......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试进阶方向 测试进…...

mysql慢查询:pt-query-digest 分析
"某些SQL语句执行效率慢",这个问题总体上分为两类: 出现了慢查询语句某些查询语句没有使用索引 由于数据的写入量非常大,所以要想直接打开慢查询日志来查看到底哪些语句有问题几乎是不可能的,因为日志的刷新速度太快了…...

git的使用整合
git的下载和安装暂时不论述了,将git安装后会自动配置环境变量,所以环境变量也不需要配置。 一、初始化配置 打开git bash here(使用linux系统下运行的口令),弹出一个类似于cmd的窗口。 (1)配置属性 git config --glob…...

XCPC第九站———背包问题!
1.01背包问题 我们首先定义一个二维数组f,其中f[i][j]表示在前i个物品中取且总体积不超过j的取法中的最大价值。那么我们如何得到f[i][j]呢?我们运用递推的思想。由于第i个物品只有选和不选两种情况,当不选第i个物品时,f[i][j]f[i…...

【软考 系统架构设计师】论文范文④ 论基于构件的软件开发
>>回到总目录<< 文章目录 论基于构件的软件开发范文摘要正文论基于构件的软件开发 软件系统的复杂性不断增长、软件人员的频繁流动和软件行业的激烈竞争迫使软件企业提高软件质量、积累和固化知识财富,并尽可能地缩短软件产品的开发周期。 集软件复用、分布式对…...

spring-integration-redis中分布式锁RedisLockRegistry的使用
pom依赖:<!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.integ…...

城市通电(prim算法)
acwing3728 蓝桥杯集训每日一题 平面上遍布着 n 座城市,编号 1∼n。 第 i 座城市的位置坐标为 (xi,yi) 不同城市的位置有可能重合。 现在要通过建立发电站和搭建电线的方式给每座城市都通电。 一个城市如果建有发电站,或者通过电线直接或间接的与建…...

【动态规划】
动态规划1引言题目509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯小结53. 最大子数组和结语引言 蓝桥杯快开始了啊,自从报名后还没认真学过算法有(>﹏<)′,临时抱一下佛脚,一起学学算法。 题目 509. 斐波那契数 斐波那契数 &am…...

秒懂算法 | DP概述和常见DP面试题
动态(DP)是一种算法技术,它将大问题分解为更简单的子问题,对整体问题的最优解决方案取决于子问题的最优解决方案。本篇内容介绍了DP的概念和基本操作;DP的设计、方程推导、记忆化编码、递推编码、滚动数组以及常见的DP面试题。 01、DP概述 1. DP问题的特征 下面以斐波那…...

【C++提高编程】C++全栈体系(二十五)
C提高编程 第四章 STL- 函数对象 一、函数对象 1. 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类&…...