在算法逻辑上,二叉树的查找效率和比较次数都是最小的,但是在实际问题中,还要考虑磁盘IO.

数据库索引是存储在磁盘上的,当数据量比较大时,索引可能几个G。

当我们利用索引查询的时候,不能将整个索引全部加载到内存中,能做的只能是逐一加载每一个磁盘页,这里的磁盘页对应索引树的节点。

二叉查找数、平衡二叉树、红黑树是典型的二叉查找数结构,其查找的时间复杂度为O(log2N)与树的深度有关,所以降低树的深度自然能提高查找效率。

在实际场景中:大规模数据存储中,实现索引查询这样一个实际场景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而降低查询效率低下,所以就思考如何降低树的深度(当然不能减少查询的数据量),一个基本的想法是:采用多叉树结构

B树和B+树是平衡的多路查找树

一、B树

简单来说:B树是一种多路平衡查找树,它的每一个节点最多包含k个孩子,k也称为阶树。

k的大小取决于磁盘页的大小

概念:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构,让我们来看看他有什么特点;

规则:

(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;

(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);

(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);

(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;

用途:

文件系统和部分数据库索引,比如著名的非关系型数据库MongoDB

最后我们用一个图和一个实际的例子来理解B树(这里为了理解方便我就直接用实际字母的大小来排列C>B>A)

高度每下降一级,即读取一次磁盘(一次I/O);当一个磁盘页数据读取到内存,对一个节点内数据查找,速度很快,几乎可以忽略。所以树的高度足够低,I/O次数足够少,就能提升性能。

B树的查询流程:

如上图我要从上图中找到E字母,查找流程如下

(1)获取根节点的关键字进行比较,当前根节点关键字为M,E

(2)拿到关键字D和G,D

(3)拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);

考题:M阶B-树中含有N个关键字,最大深度为:

至于为什么不能叶节点不能存储关键字,查看如下原因:

叶子结点是不存在的,指向这些结点的指针为空,引入叶子结点的目的是为了方便分析B-树的查找性能

一棵3阶B-树中含有2047个关键字,包含叶结点层,该树的最大深度为(12)

二、B+树

B+树的性能比B树更高

1.与B树区别:

①有n棵子树的节点含有n个关键码

②所有的叶节点中包含了全部关键码的信息,以及指向含有这些关键码记录的指针,且叶子节点本身依关键字大小自小而大顺序连接

③所有的非终端节点可以看成是索引部分,节点中仅含有其子树根节点中最大(小)的关键字

对③理解

卫星数据:索引元素所指向的数据记录,比如数据库中的某一行。在B树中,无论是中间节点还是叶子节点都有卫星数据。

而B+树中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联

在B+树中,通常有两个头指针,一个指向根节点,另一个指向关键字最小的叶节点。因此,可以对B+数进行两种查找运算:一种是从最小关键字开始顺序查找,另一种是从根节点进行随机查找。

查找过程与B树类似,但是有两点不同(也是查找效率更优的原因)

①B+树的中间节点,没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素【 “更矮胖”,查询时IO次数更少】

②B+树必须查找到叶子节点,而B树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点

因此B树查找性能并不稳定(最好,只查根节点,最坏情况是查到叶子节点)。而B+树的每一次查找都是稳定的,都要到叶子节点

2.B+树的优势

单一节点存储更多元素,io更少

所有查询都要查找到叶子节点,查找性能稳定

所有叶子节点形成有序链表,便于范围查询

3.B+树应用场合

大部分的关系数据库,如Mysql

三、为什么B+树比B树更适合实际应用中操作系统的文件索引和数据库索引

因为数据表的索引比较大,不能常驻内存,所以以文件形式存储在磁盘中。当查询数据的时候就需要I/O操作。高效率查询的目标是较少的I/O次数。一次I/O一般是读取一页大小的数据。当申请一个节点时,就以页的大小来申请。也就是说一次I/O可以读取一个节点的数据。这样,B树也可以作为索引数据结构,但是最终还是选择了B+树。

①B+树的内部节点并没有指向关键字具体信息。因此可以存储更多的数据。索引树更加矮胖,I/O次数更少

②B+树的查询效率更加稳定

由于非终节点并不是最终指向文件内容的节点,而只是叶子节点中关键字的索引。所以任何关键字的查找必须从根节点到叶子节点。所有关键字查询路径长度相同,导致每一个数据的查询效率相当。

③范围查找简单:B+树不需要中序遍历,遍历链表即可。

四、hash比B+树更快,为啥mysql还用B+树来存索引

和具体的业务场景有关,如果只选一个数据,那确实hash更快。但是数据库中经常会选择多条,这时B+树索引就更快了。

而且数据库中索引一般放在磁盘中,数据量大的情况,无法一次装入内存,B+数的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

mysql 节点查根_(三)B数、B+树及在数据库索引中应用相关推荐

  1. mysql打平子表_对于oracle进行简单树查询(递归查询)

    DEPTID PAREDEPTID NAME NUMBER NUMBER CHAR (40 Byte) 部门id 父部门id(所属部门id) 部门名称 通过子节点向根节点追朔. Sql代码 selec ...

  2. 艾伟_转载:使用LINQ to SQL更新数据库(中):几种解决方案

    在前一篇文章中,我提出了在使用LINQ to SQL进行更新操作时可能会遇到的几种问题.其实这并不是我一个人遇到的问题,当我在互联网上寻找答案时,我发现很多人都对这个话题发表过类似文章.但另我无法满足 ...

  3. mysql配置数据库连接池_三种数据库连接池的配置

    三种数据库连接池的配置及使用(For JDBC) 连接池的优缺点 优点 使用连接池的最主要的优点是性能.创建一个新的数据库连接所耗费的时间主要取决于网络的速 度以及应用程序和数据库服务器的 ( 网络 ...

  4. mysql mof提权_三、mysql 之mof提权学习

    一.测试环境 win2003 + phpnow 二.使用条件 mysql + root权限 三.工具准备 (1)工具1: 准备好mof提权脚本(具体mof脚本,已上传网盘) (2)工具2: 准备好菜刀 ...

  5. mysql注入攻击实_三十三、MySQL基础系列笔记之MySQL安全问题与SQL注入攻击

    SQL注入攻击大多数与程序有关系,程序不严谨是导致SQL注入攻击成功的一个原因.安全问题不容忽视,平常的开发中应关注安全问题.下面简单记录PHP中的SQL攻击问题. 什么是SQL注入攻击 SQL注入( ...

  6. mysql udf提权_三分钟解析postgresql提权

    本头条号所分享文章仅供学习交流,请勿非法使用! 近期遇到一些关于提权的问题,和大家分享一下~ 创建环境 介绍 docker中有一个COPY命令: COPY 在 PostgreSQL表和标准文件系统文件 ...

  7. MySQL登录验证码原理_三:验证码的原理、作用及实现

    验证码的原理.作用及实现 一.前言 最近学习实现了验证码,首先附图效果如下:( 简单说明: 分别提交正确.错误的验证码及对应效果 本文是图文结合说明) 二.验证码的作用 验证码是目前大多网站所支持并使 ...

  8. mysql 分类标签表设计_如何进行文章分类和标签的数据库设计

    几乎在所有web项目中,都涉及文章分类和标签的设计,应该说这是一个比较常见.典型的案例.站长并不保证我的思路就是最好的,只是分享出来大家一起交流一下,互相促进与提高. 我们假设的开发项目是一个博客系统 ...

  9. 用navixt连接mysql连接不上_迪兰RX 5600 XT X战神评测:中端的芯,旗舰的用料

    [PConline 评测]RX 5600 XT发布有一段时间了,这款产品有着非常出色的能耗比和不俗的游戏性能,本应在市场有一番大作为,不过由于首发价格诚意稍显不足,所以没有吸引到很多人.但通常情况下电 ...

最新文章

  1. GAN眼中的图像翻译(附神奇歌单)
  2. C++中public protected private关键字
  3. python信号与槽_Python信号和插槽(1),python,与,一
  4. PHP json_encode() 函数介绍
  5. Winform中设置ZedGraph鼠标焦点位置画出十字线并在鼠标移出时十字线消失
  6. 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
  7. 牛客题霸 NC29 二维数组中的查找
  8. asp。net中常用的文件操作类
  9. luci编程 openwrt_openwrt开源系统LUCI配置界面
  10. 怎么捡自己空投_“吃鸡”里信号枪子弹可以复制?玩家发现神秘技巧,空投捡到手软...
  11. 牛客练习赛39 B 选点(dfs序+LIS)
  12. 怎样才能做好技术团队管理
  13. unity中使用protobuf-net
  14. 如何基于protobuf实现一个极简版的RPC(转载)
  15. mtk刷机工具sp flash tool_qpst刷机(翻到高中刷机时的记录,想来qpst对现在玩机的人也有用吧...
  16. c语言表达式判断语法错误题,大连理工大学C语言模拟题机房题库单选、判断、填空(分章节_共十一章)...
  17. 邮件系统被退回的原因及解决办法
  18. 微信公众号申请流程整理
  19. Android TextView设置背景色和边框
  20. 桌面新建文件夹不显示缩图_如何在Windows 10桌面上创建不可见的文件夹

热门文章

  1. PHP基础班初学心得:脑洞实验-JS变量存储函数与return的一些问题
  2. CSS 外边距(margin)重叠及防止方法
  3. 初次树莓派遇到的一些小问题
  4. DNN 4.6.2的中文语言包
  5. Win32 ASM 简单对话框编程Demo
  6. oracle第一次使用语句创建作业失败记
  7. 一段动态生成表格的JSP代码讲解
  8. 关于ASP.Net的导入导出的[转]
  9. 使用tag标签是SEO优化的重要性是什么?
  10. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III