对数据库中索引及索引的数据结构的理解

news/2024/11/9 2:41:06/

索引就像是书或者论文的目录, 通过目录能够快速定位到某一章节, 加快了查找的效率, 减少插入和删除操作; 那么知道索引是干啥的了, 那索引的底层数据结构是什么呢???

索引

  • 1 简述
  • 2 索引考虑的数据结构

1 简述

  如果数据库中没有索引, 查找的时候就会遍历整个表; 如果针对的是顺序表查找, 因为顺序表在内存中, 访问速度比较快, 而且数据也没那么多, 效率还是可以的; 但是如果针对数据库进行顺序查找, 数据库的数据都存在磁盘上, 磁盘的访问速度会很慢, 并且数据量也会很多, 这时候查找的效率就非常低. 而索引就是为了避免数据库进行顺序查找, 提高了查找效率.


2 索引考虑的数据结构

  关于索引的数据结构肯定首先想到的是二叉搜索树或者是哈希表, 对于二叉搜索树如果比较平衡, 那么查找的效率为 O(logN); 如果是哈希表则查找效率为 O(1);

其实数据库的索引也可以考虑使用哈希表, 但是会存在问题, 毕竟是一对一的关系, 只能处理相等的情况, 如果遇到 id > 3 且 id < 9 这种情况, 这时候哈希表就不适用了.

  二叉搜索树的内部元素是有序 (中序遍历), 例如还是查找 id > 3 且 id < 9 的情况, 具体流程: 先找到 id 为 9 的元素, 再找到 id 为 3 的元素, 中序遍历中 3 和 9 之间的结果就是想要的结果, 效率为 O(N); 相比于哈希表, 二叉搜索树虽然能够处理范围查找, 但是处理效率并不高:

  • 二叉搜索树每个节点最多有两个分叉, 当数据量比较大的时候树的高度就会很高, 最终的效率也会很低;

  • 二叉搜索树直接获取到中序遍历也不是很高效, 为 O(N).

因此真实的索引结构是 N 叉搜索树, 也就是 B+ 树, 和 B 树相比, 主要两个功能发生了变化:

  • 每一层的元素之间都链接到了一起;
  • 数据只在叶子节点上保存, 非叶子节点上只保存一些辅助查找的边界信息 (也就是说非叶子节点只保存 id, 辅助快速找到想要的 id 对应的节点).

针对 N 叉搜索树查询任何一条记录速度是比较平均的, 不会出现效率差异大的情况, 不需要进行额外的中序遍历; 并且叶子节点放在磁盘上, 非叶子节点放在内存中 (B 树的叶子节点 / 非叶子节点都放在磁盘上存储数据), 这样查找效率就会更高, 减少了读磁盘的次数, 毕竟索引在内存中占用的实际开销也不是很高.


http://www.ppmy.cn/news/42753.html

相关文章

科普:java与C++的区别

Java与C是两种广泛使用的编程语言&#xff0c;它们在某些方面存在不同之处。本文将详细介绍Java与C的区别。 一、C与Java的历史 C语言是由Bjarne Stroustrup在20世纪80年代初期开发的一种面向对象编程语言&#xff0c;它是C语言的扩展。Java语言是由Sun Microsystems公司于20…

Python pandas和numpy用法参考(转)

以下是转载&#xff1a;Python pandas用法 - 简书介绍 在Python中&#xff0c;pandas是基于NumPy数组构建的&#xff0c;使数据预处理、清洗、分析工作变得更快更简单。pandas是专门为处理表格和混杂数据设计的&#xff0c;而NumPy更适合处...https://www.jianshu.com/p/840ba1…

今日刷题 动态dp比较简单状态机模型

题目描述&#xff1a;1186. 删除一次得到子数组最大和 一个很好的题解&#xff0c;受益匪浅 比较通俗易懂的dp - 删除一次得到子数组最大和 - 力扣&#xff08;LeetCode&#xff09;&#xff1a; 我们定义f ( i ) 和 g ( i )&#xff0c;其中 f( i ) 表示不删除元素的情况下…

2.29、共享内存(2)

2.29、共享内存&#xff08;2&#xff09;1、问题1&#xff1a;操作系统如何知道一块共享内存被多少个进程关联&#xff1f;2、问题2&#xff1a;可不可以对共享内存进行多次删除 shmctl3、共享内存和内存映射的区别1、问题1&#xff1a;操作系统如何知道一块共享内存被多少个进…

EMC经典问答85问(78-81问)

78、磁珠与电感有什么区别&#xff1f;高频时磁珠怎么滤波&#xff1f; 电感是用来控制 PCB 内的 EMI。对电感而言&#xff0c;它的感抗是和频率成正比的。这可以由公式&#xff1a;XL 2πfL 来说明&#xff0c;XL 是感抗&#xff08;单位是Ω&#xff09;。例如&#xff1a;一…

【react 全家桶】初始化脚手架

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录10 【初始化脚手架】1.什么是 React 脚手…

语聊房app的开发以及运营思路

语聊房app是一种基于实时语音交流的社交应用&#xff0c;用户可以通过该应用结识新朋友、交流经验、分享兴趣爱好等&#xff0c;因此备受年轻用户的青睐。以下是语聊房app的开发以及运营思路&#xff1a; 一、开发思路 功能设计 语聊房app的核心功能是实时语音聊天&#xff0…

vuex( 笔记二 )

https://vuex.vuejs.org/zh/guide/actions.html 强制数据渲染&#xff1a;this.$forceUpdate(); &#xff08;1&#xff09;主要格式 &#xff08;1.1&#xff09;store/index.js import Vue from vue import Vuex from vuex Vue.use(Vuex)const store new Vuex.Store({ /…