【索引】数据库索引之散列索引

news2024/12/23 22:42:49

目录

1、什么是散列?

2、如何评价一个散列函数的好坏?

3、散列中的桶溢出处理

4、散列在索引中的应用

4、顺序索引和散列索引的比较


1、什么是散列?

        顺序文件组织的一个缺点是我们必须访问索引结构来定位数据,或者必须使用二分法搜索,这将导致过多的 I/O 操作。基于散列(hashing)技术的文件组织使我们能够避免访问索引结构。//使用散列可以减少查找的次数。所谓散列,其实就是键值对的映射,而映射效果由散列函数决定

        在散列中,散列桶(bucket)用来表示能存储一条或多条记录的一个存储单位。通常一个桶就是一个磁盘块,但也可能小于或大于一个磁盘块。

        正规地说,令 K 表示所有搜索码值的集合,令 B 表示所有桶地址的集合,散列函数就是一个从 K 到 B 的函数。我们用 h 表示散列函数

        为了插人一条搜索码为 K_{i} 的记录,我们计算 h(K_{i}),它给出了存放该记录的桶的地址。我们目前假定桶中有容纳这条记录的空间,于是这条记录就存储到该桶中。//插入

        为了进行一次基于搜索码值 K_{i} 的查找,我们只需计算 h(K_{i}),然后搜索具有该地址的桶。假定两个搜索码 K_{5} 和 K_{7} 有相同的散列值,即 h(K_{5})= h(K_{7})。如果我们执行对K_{5} 的查找,则桶h(K_{5})包含搜索码值是K_{5}以及K_{7}的记录。因此,我们必须检查桶中每条记录的搜索码值,以确定该记录是否是我们要查找的记录。//查询,注意可能出现hash冲突

        删除也一样简单。如果待删除记录的搜索码值是K_{i},则计算h(K_{i}),然后在相应的桶中查找此记录并从中删除它。

        //使用好的散列函数一般来说可以避免繁琐的查询过程,使查询一步到位

2、如何评价一个散列函数的好坏?

        最坏的可能是散列函数把所有的搜索码值映射到同一桶中。这种函数并不是我们所期望的,因为所有的记录不得不存放到同一个桶里。查找一个需要的记录时将不得不检查所有记录。//此时的散列就像退化成了一个链表,散列函数没有任何的散列效果

        理想的散列函数需要达到的效果:

        理想的散列函数把存储的码均匀地分布到所有桶中,使每个桶含有相同数目的记录

        由于设计时我们无法精确知道文件中将存储哪些搜索码值,因此我们希望选择一个把搜索码值分配到桶中并且具有下列分布特性的散列函数。

  • 分布是均匀的。即散列函数从所有可能的搜索码值集合中为每个桶分配同样数量的搜索码值
  • 分布是随机的。即在一般情况下,不管搜索码值实际怎样分布,每个桶应分配到的搜索码值数目几乎相同。更确切地说,散列值不应与搜索码的任何外部可见的排序相关,例如按字母的顺序或按搜索码长度的顺序。散列函数应该表现为随机的。

        //散列函数的设计有一定的困难,可能需要针对特定的场景进行特定的设定,但是搜索码具有随机性,又很难做到有放之四海而皆准的散列函数

3、散列中的桶溢出处理

        当插人一条记录时,记录映射到的桶有存储记录的空间。如果桶没有足够的空间,就会发生桶溢出(bucket overflow)

        处理桶溢出一般有两种方案,即闭地址(close addressing)方案和开地址(open addressing)方案。

        所谓的闭地址法也被称为链地址法(Chaining)。在这种方法中,每个哈希表的槽(bucket)是一个链表。当多个键被哈希到同一个槽时,这些键会被存储在该槽的链表中。

        比如,我们可以用溢出桶来处理桶溢出问题。如果一条记录必须插入桶 b 中,而桶 b 已满,系统会为桶 b 提供一个溢出桶,并将此记录插人到这个溢出桶中。如果溢出桶也满了,系统会提供另一个溢出桶,如此继续下去。一个给定桶的所有溢出桶用一个链接列表链接在一起,如下图所示:

        闭地址方案容易实现,但是有额外的链表存储开销。如果链表长度增加时,查找时间可能变长

        另一种方案就是开地址。开地址通过寻找其他空闲槽来处理冲突。在这种方法中,当一个槽已经被占用时,系统会根据一定的探测(probing)策略来寻找下一个可用的槽。

        开地址方案的好处是不需要链表,从而节省存储空间。但是在高负载因子下,探测序列变长,性能会出现明显的下降,所以需要有良好的探测策略以避免群聚(clustering)现象

        群聚(Clustering)现象在哈希表中指的是由于哈希冲突处理方法导致一系列相邻槽变得拥挤,从而影响哈希表的性能。这种现象主要出现在线性探测和二次探测中。

4、散列在索引中的应用

        散列不仅可以用于文件的组织,还可以用于索引结构的创建。散列索引(hash index)将搜索码及其相应的指针组织成散列文件结构

        我们可以按如下方法构建数据库的散列索引。将散列函数作用于搜索码以确定对应的桶,然后将此搜索码以及相应指针存入此桶(或溢出桶)中。

        下图给出了 instructor 文件上的一个辅助散列索引,其搜索码是 ID。图中的散列函数计算 ID 的各位数字之和对 8 取模的结果。该散列索引有 8 个桶,每个桶的大小为 2。其中一个桶有三个码映射到它,因此它有一个溢出桶。在这个例子中,ID 是 instructor 的主码,所以每个搜索码只对应一个指针。一般情况下,每个码可能对应多个指针。//其实就是Hash表

4、顺序索引和散列索引的比较

        顺序索引,是一种基于树的索引,最常见的是 B- 树和 B+ 树索引。它与散列索引最大的区别就在于顺序索引支持范围查询和排序,精确匹配的效率也尚可接受,更具通用性​//比如Mysql、PostgreSQL数据库等

        散列索引不支持范围查找和排序,虽然精确查找效率高,但是相比来说通用性更差。因此,散列索引更适用于需要快速查找的场景,比如缓存系统(Memcached 和 Redis等)

        以下是顺序索引和散列索引的简单对比表:

特性顺序索引散列索引
数据存储顺序有序存储无序存储
支持的查询类型范围查询、排序、精确匹配精确匹配
查询效率O(log n)O(1)
插入/删除效率O(log n)O(1)
结构类型B-树或 B+树结构哈希表结构
适用场景范围查询、排序查询、唯一性约束精确匹配查询、高频查找操作
不支持的操作N/A范围查询、排序查询
维护成本较高较低
空间利用率较高取决于哈希函数和哈希表大小

        至此,全文结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1869993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

datax入门(datax的安装与简单使用)——01

datax入门(datax的安装与简单使用)——01 1. 官网2. 工具部署(通过下载DataX工具包)2.1 下载、解压2.2 配置2.2.1 查看配置模版2.2.2 根据模版配置json2.2.3 启动DataX 3. datax的简单使用3.1 mysql2stream3.2 mysql2mysql3.2.1 拼…

HTML【重点标签】

一、列表标签 1.无序列表 父级别: 无序列表的标题 ----表示无序列表的整体,用于包裹li标签 子级别: 无序列表一行的内容 ----表示无序列表的每一项,用于包含一行的内容 语义:构建没有顺序的列表 特点:列…

php聚合快递寄快递小程序

一、引言:告别传统寄件,拥抱便捷新选择 在数字化时代,我们越来越追求便捷和高效。传统的寄件方式已经无法满足现代人快速、便捷的需求。因此,一款聚合快递优惠寄件小程序应运而生,它集合了多家快递公司,为…

Linux高级编程——进程

1.进程的含义? 进程是一个程序执行的过程,会去分配内存资源,cpu的调度 PID, 进程标识符 当前工作路径 chdir umask 0002 进程打开的文件列表 文件IO中有提到 (类似于标准输入 标准输出的编号,系统给0,1&#xf…

台灯的功能作用有哪些?分享好用的护眼灯!看完就知道台灯怎么选

在当今时代,学生们长时间地沉浸于平板、手机、电脑等电子设备中,这些设备的屏幕往往伴随着频闪和蓝光辐射,这无疑对视力健康构成了潜在威胁。家长们日益关注孩子的护眼养眼问题,因为视力疲劳和眼部疾病不仅会降低个体的生活质量&a…

Hyperf 在 NginxProxyManager 如何配置 websocket?

新建代理 填写域名等服务信息&#xff0c;选择支持WebSockets。 创建 SSL 编写nginx配置 location /message.io{proxy_pass http://<你的ip>:<对应端口号>;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upg…

VMware虚拟机三种网络模式设置 - Host-Only(仅主机模式)

一、前言 在之前的《Bridged&#xff08;桥接模式&#xff09;》、《NAT&#xff08;网络地址转换模式&#xff09;》中&#xff0c;我详细介绍了虚拟机网络模式设置中的桥接模式与网络地址转换模式。今天详细讲解一下Host-Only&#xff08;仅主机模式&#xff09;。 在VMware虚…

vue + Lodop 制作可视化设计页面 实现打印设计功能(二)

历史&#xff1a; vue2 Lodop 制作可视化设计页面 实现打印设计功能&#xff08;一&#xff09; 前言&#xff1a; 之前本来打算用直接拿之前做的vue2版本改改就发的&#xff0c;但考虑到现在主流都是vue3了&#xff0c;所以从这篇文章开始使用vue3来写&#xff0c;以及最后…

4年突破20亿,今麦郎如何持续策划凉白开极致产品力?

范总在方便面市场拥有30年的丰富经验&#xff0c;并曾创造过奇迹。1994年&#xff0c;他从冰糖生意进入方便面行业&#xff0c;创立今麦郎的前身华龙集团。当时&#xff0c;方便面市场已经进入红海阶段&#xff0c;市场上有上千家企业&#xff0c;康师傅和统一占据了80%的市场份…

Apple Intelligence,我们能得到什么?(上)

苹果公司WWDC 2024发布会&#xff0c;苹果AI成为最吸睛的焦点。不过&#xff0c;苹果的AI不是大家口中的AI&#xff0c;而是苹果独有的概念&#xff1a;Apple Intelligence&#xff0c;苹果智能。 所谓Apple Intelligence&#xff0c;被定义为iPhone、iPad和Mac的个人智能系统…

Arduino - 继电器

Arduino - 继电器 In a previous tutorial, we have learned how to turn on/off an LED. In this tutorial, we are going to learn how to turn on/off some kind of devices that use the high voltage power supply(such as a light bulb, fan, electromagnetic lock, lin…

Linux高并发服务器开发(五)终端和守护进程

文章目录 1 概念2 会话基本概念和API3 守护进程&#xff08;重点&#xff09;守护进程模型 4 获取当前系统时间 1 概念 终端 进程的集合叫进程组 也称为作业 是执行程序的过程 2 会话基本概念和API 进程组的集合 3 守护进程&#xff08;重点&#xff09; 独立于控制…

Linux内核中网络数据的流量控制(TC: Traffic control 和 QDISC)

(个人能力有限&#xff0c;本文如有错误之处&#xff0c;欢迎交流指正) 1 简介 在进行网络数据 接收 和 发送 过程中&#xff0c;网卡设备到L3(网络层) 中间会经历流量控制(Traffic control)。 《BPF之巅.洞悉Linux系统和应⽤性能》P413 qdisc这个可选层可以⽤来管理⽹络包的…

机器学习-数据预处理-聚类-回归-分类-单车数据集

机器学习-数据预处理-聚类-回归-分类-单车数据集 前言一、数据预处理1. 导入数据集2. 数据预处理3. 处理缺失值4. 生成特征用于后续进一步的分析 二、数据分布可视化1. 骑行时长分布2. 起始站和终点站分布可视化3. 高峰期与非高峰期骑行频次分布 三、聚类分析1. K-means聚类 四…

PostgreSQL 连接器:在 SeaTunnel 中的应用与优势

在现代企业中&#xff0c;数据已经成为核心资产&#xff0c;基于开源数据集成平台SeaTunnel&#xff0c;工程师如何高效地连接和管理这些数据源&#xff0c;直接关系到企业的竞争力和运营效率。 本文将给大家介绍如何通过 JDBC PostgreSQL 数据源连接器&#xff0c;在 SeaTunne…

240627_图像24位深度(RGB图)转为8位深度(单通道图)

240627_图像24位深度&#xff08;RGB图&#xff09;转为8位深度&#xff08;单通道图&#xff09; 在使用网络上下载下来的一部分图像分割数据集时&#xff0c;有些标签图你看着是一个黑白图&#xff0c;但是他还是有可能是一张RGB三通道图&#xff0c;具体怎么区分呢。右击图…

ARM芯片架构(RTOS)

前言&#xff1a;笔记韦东山老师的rtos教程&#xff0c;连接放在最后 #ARM介绍 arm芯片属于精简指令集risc&#xff0c;所用的指令比较简单&#xff0c;ARM架构是一种精简指令集&#xff08;RISC&#xff09;架构&#xff0c;广泛应用于移动设备、嵌入式系统、物联网等领域。AR…

英国国王座驾车标的逆向工程

多功能设计和制造解决方案为独特的挑战提供了引人注目的优势。Impossible Creations是一家来自英国的定制扫描、设计和建模公司&#xff0c;专门帮助客户完成无限制得创作任务。在他们最近接到的一个项目中&#xff0c;为了修复象征英国国王座驾的大英帝国吉祥物&#xff0c;Im…

【博士每天一篇文献-综述】Biological underpinnings for lifelong learning machines

阅读时间&#xff1a;2023-12-17 1 介绍 年份&#xff1a;2015 作者&#xff1a;Dhireesha Kudithipudi&#xff0c;Mario Aguilar-Simon&#xff0c;其中通讯作者Josh Bongard教授也是另一篇论文的通讯作者《Neural modularity helps organisms evolve to learn new skills …

widows下 vscode 的 terminal / powershell,ctrl+v失灵,输出^v

问题 原因 最近装了PSReadLine Import-Module PSReadLineSet-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineOption -EditMode Emacsvscode不兼容 解决方法 注释掉最后面的 Import-Module PSReadLineS…