首页 > 数据库 >【Java】【数据库】索引为何使查询变得更快?--B+树

【Java】【数据库】索引为何使查询变得更快?--B+树

时间:2022-12-10 11:22:05浏览次数:74  
标签:Java 指向 -- 叶子 索引 查找 59 节点

排序数据的二分查找

二分查找的时间复杂度是\(O(log_2n)\),明显快于暴力搜索。

索引

建立索引的数据,就是通过事先排好顺序,在查找时可以应用二分查找来提高查询效率。

所以索引应该尽可能建立在主键这样的字段上,因为主键必须唯一,所以这样生成的二叉查找树的效率是最高的。

数据库索引的原理-- B+ 树

数据库用 B+ 树来实现索引

B+ 树
其中, 非叶子节点形如

\(<P_1,K_1,P_2,K_2,...,P_{c-1},K_{c-1},P_c>\)

以第一层为例,\(<P_1,59,P_2,97,P_3>\).满足数据部分(\(K_i\))从小到大有序排列,且指针\(P_i\)指向的下一个节点\(X\)满足\(K_{i-1}<X<=K_i\) , 例如图中的树,59在它左边节点指向的树里,44在它左边结点指向的树里,15在它左边结点指向的树里,且都是在最右边的位置

B+树延伸

查找操作

以上图查找\(key=59\)为例,
先访问根节点\([59,97]\), 发现\(key\)小于等于根节点中的第一个数\(59\), 于是继续访问\(59\)左边的指针指向的节点\([15,44,59]\), 发现\(key\)小于等于第三个树\(59\), 于是访问\(59\)左边的指针指向的叶子节点\([51,59]\), 遍历找到要查找的元素\(59\).

叶子节点的详细结构如下图
B+ 树的叶子节点

由于数据指针只在叶子节点上,所以 B+ 树所有查询所有关键字的磁盘 \(I/O\) 的次数都是树的高度。

区间查找

在上面的叶子节点图中,我们可以看到每个叶子节点有一个指针\(P_{next}\), 它的作用体现在区间查找的时候。
B+ tree
例如,需要查询\([21,63]\)之间的关键字。

  1. \(21<59\),访问\(59\)左边指针指向的节点\([15,44,59]\).
  2. \(15<21<44\), 访问\(44\)左边指针指向的叶子节点\([21,37,44]\).
  3. 遍历这个叶子节点找到\(21\),下面的操作就如同单链表的遍历,一直遍历到\(63\)即可.

插入操作

不细说了,这篇文章的动图能说明一切知乎文章
只把动图贴到这里
没有超出叶子结点的最大容量m
1
超出m,要分裂叶子节点
2
分裂叶子节点导致上层的节点也超出m,要分裂上层的节点
3
插入数值比当前最大值还大,要保证新的最大值在根节点中,需要重新调整 B+ 树
4

B+ 树的复杂度

查找、插入和删除等操作的时间复杂度都是\(O(logn)\)
至于这个结论怎么得出的,还是看那篇知乎文章吧,写得太好了。

标签:Java,指向,--,叶子,索引,查找,59,节点
From: https://www.cnblogs.com/DXD-blog/p/16971215.html

相关文章

  • WinForm(三)揭开可视化控件的面纱
    WinForm所见即所得的UI设计框架,开发效率确实有所提升,同时降低了编程门槛,让WinForm更普及。拖拖拽拽就能设计出一个界面,那么我们拖拽的这些东西是什么?它们是什么原理?。......
  • 【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 如何选择好的软件测试技术?
    软件测试技术是指测试软件或软件一部分的方法或方式。每种测试技术都有其自身的优势。不同的技术针对不同类型的缺陷。因此,说一种技术是最好的是错误的。根据软件及其......
  • 软件测试缺陷管理BUG的几种状态
    软件的缺陷是软件开发过程中的重要属性,它提供了许多信息。不同成熟度的软件组织采用不同的方式管理缺陷。低成熟度的软件组织会记录缺陷,并跟踪缺陷纠正过程。高成熟度......
  • 华普物联HP-ERS-T200的HTTP工作模式POST和GET示例教程
    示例操作流程1、准备HP-ERS-T200、电源、网线;接线完成,给HP-ERS-T200上电;打开配套参数设置软件,配套软件下载链接:http://www.hpiot.cn/index/Download/down.html?id=23  ......
  • 解决Mac IntellIJ Idea 卡顿问题,修改内存大小
      我们在工作中,经常会遇到因为IntellIJIdea内存不足而卡顿的问题,可以通过两种方法调整idea的内存大小。我的IDEA版本是2021.2。  第一种调整内存的方法是ChangeMem......
  • [LeetCode] 2049. Count Nodes With the Highest Score
    Thereisa binary treerootedat 0 consistingof n nodes.Thenodesarelabeledfrom 0 to n-1.Youaregivena 0-indexed integerarray parents r......
  • 【工具】简陋的异步转同步队列
    前言最近碰到一个场景,在开发一个需求的过程中将系统的接口封装了一层,但是系统接口全部是以异步的形式回调的,这导致两个问题:外部操作传入封装类的时候,上一次的操作还未完......
  • Opensuse:最满意、最喜欢的发行版
    最近对Fedora有些不满意,不是不好用,也挺好用的:安装简单(只有分区配置处若不想自动分区就比较简陋、提示太少)、界面简洁(可以说是优点,但还是喜欢更丰富、美观的桌面)、更新和升......
  • 软件测试工程师需要遵循的四个原则
    软件测试很多时候是围绕着客户体验的角度为主,软件测试工程师需要对产品进行全面认真细致的检测,尽可能的去发现多的Bug,并且跟踪和分析好产品中存在的问题,并对其中不足之......