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

目录

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.mzph.cn/bicheng/36313.shtml

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

相关文章

软件协同开发是一种通过团队合作来创建软件的开发方法

软件协同开发是一种通过团队合作来创建软件的开发方法。与传统的瀑布模型相比,软件协同开发强调团队成员之间的合作和沟通,以实现更高效的开发过程和更优质的软件产品。 在软件协同开发中,团队成员通过一系列工具和技术来协同工作。这些工具…

MATLAB2024a下的BP神经网络分类工具箱预测

1 打开BP神经网络分类工具箱GUI界面 图1-1 如图1-1所示,虽然叫神经网络模式识别但确实是BP神经网络分类工具箱,如果想要使用其他神经网络模型,可以打开左边的深度网络网络设计器,如图1-2、图1-3所示: 图1-2 图1-3 2 导…

以入站营销为核心,撬动To B业务增长新杠杆

传统的营销模式已逐渐失效,企业需要寻找新的营销策略来吸引客户并推动业务增长。Outbound marketing(出站营销)作为一种传统的营销方式,虽然在过去发挥了重要作用,但在数字化时代,其局限性也日益明显。 数字…

use embeddings stored in vector db to reduce work for LLM generating response

题意:使用存储在向量数据库中的嵌入来表示,以减少大型语言模型(LLM)生成响应的工作量。 问题背景: Im trying to understand what the correct strategy is for storing and using embeddings in a vector database, …

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练

在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模&#…

如何在ArcGIS Pro中提取行政区划

我们在《2024版有审图号的SHP行政区划》一文中,为你分享过全国省市县级的行政区划。 现在再为你分享一下,如何在ArcGIS Pro中提取目标范围行政区划的方法,你还可在以文末查看领取该行政区划数据的方法。 直接选择 在菜单栏上点击一下选择下…

这谁顶得住啊!AI绘画模型竟然可以画出质量逼真的黑丝!

今天看到一个有趣的AI绘画玩法,用SD画黑丝!话不多说,开始今天的实战演练。 首先做好准备工作:部署好本地Stable Diffuison 然后就轮到今天的主角上场了 黑丝Lora模型:perfectpantyhose 这是一款叫perfectpantyhose…

【最佳实践】前端如何搭建自己的cli命令行工具,让自己编码的时候如虎添翼

作为前端开发人员,搭建自己的前端CLI工具是一个有趣且有意义的事情。以下是一篇详细的教程,包括使用场景和案例。 使用场景 假设你是一个前端团队的一员,需要频繁地在不同的项目中执行一些标准化的任务,比如: 根据模…

TikTok API接口——获取视频评论信息

一、引言 TikTok,作为全球最受欢迎的短视频社交平台之一,不仅为用户提供了展示才华和分享生活的舞台,也为品牌和企业提供了与年轻用户互动的新渠道。在这个信息爆炸的时代,了解用户的声音、掌握舆论动向显得尤为重要。通过TikTok…

alibaba easyexcel 导出excel使用

需求 传统导出&#xff0c;一般都是通过Workbook > Sheet > Row > Cell 获取详细Cell 设置值&#xff0c;比较麻烦&#xff0c;偶然遇到alibaba easyexcel 直接通过注解设置哪些需要导出 哪些忽略&#xff0c;发现特别好用。 pom依赖 <dependency><groupId…

千年织锦:中国古代包文化的辉煌历程与现代传承

追溯至远古&#xff0c;我们的祖先就开始利用自然界的恩赐——皮革、植物纤维等&#xff0c;制作出最原始的包袋。随着时间的推移&#xff0c;技艺的提升&#xff0c;包的材质逐渐丰富起来&#xff0c;从粗糙到精致&#xff0c;从简单到复杂&#xff0c;每一次材质的革新都是人…

CentOS 7.9 CDH6.3.2集群生产环境实战部署指南

一、环境准备 1、系统环境&#xff1a; # cat /etc/os-release 2、准备工作&#xff1a; 部署资源分配 节点centos 7.9&#xff08;生产&#xff09;节点规划Postgresql部署组件备注pgsql32c、128G、2TB国产数据库Postgresql&#xff08;翰高&#xff09;可根据实际情况调整…

Wordpress图像编辑插件-palleon v3.8.1中文版语言包

Palleon是一个强大的WordPress图像编辑器&#xff0c;可以与您的WordPress网站无缝集成&#xff0c;让您快速高效地工作。它拥有为你的WordPress网站创建令人惊叹的图像所需的一切。 Palleon让您完全控制图像&#xff0c;允许您逐个像素进行更改。您可以轻松地裁剪、调整图像大…

基于盲信号处理的人声分离

1.问题描述 在实际生活中&#xff0c;存在一种基本现象称为“鸡尾酒效应”&#xff0c;该效应指即使在非常嘈杂的环境中&#xff0c;人依然可以从噪声中提取出自己所感兴趣的声音。 在实际应用中&#xff0c;我们可能需要对混合的声音进行分离&#xff0c;此时已知的只有混合…

springboot 集成阿里云 OSS

引入依赖 <!-- 阿里云oss依赖 --> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.9.1</version> </dependency><?xml version"1.0" encoding"…

技术前瞻:华为鸿蒙HarmonyOS NEXT仓颉语言Beta招募亮点提前曝光

在科技迅猛发展的今天&#xff0c;华为的每一步创新都备受瞩目。6月21日&#xff0c;华为再次引领风潮&#xff0c;正式发布了自研的仓颉编程语言&#xff0c;并宣布开启HarmonyOS NEXT 仓颉语言开发者预览版Beta招募活动。这不仅是华为技术实力的展示&#xff0c;更是对开发者…

C语言基础笔记(全)

一、数据类型 数据的输入输出 1.数据类型 常量变量 1.1 数据类型 1.2 常量 程序运行中值不发生变化的量&#xff0c;常量又可分为整型、实型(也称浮点型)、字符型和字符串型 1.3 变量 变量代表内存中具有特定属性的存储单元&#xff0c;用来存放数据&#xff0c;即变量的值&a…

day53--ELK搜索

ELK搜索高级课程 1&#xff0e; 课程简介 1.1 课程内容 ELK是包含但不限于Elasticsearch&#xff08;简称es&#xff09;、Logstash、Kibana 三个开源软件的组成的一个整体。这三个软件合成ELK。是用于数据抽取&#xff08;Logstash&#xff09;、搜索分析&#xff08;Elast…

学习笔记——动态路由——OSPF(报头信息、报文信息、三张表)

六、OSPF协议的报头信息、报文信息、三张表 OSPF的协议报文在一个广播域内进行传递&#xff0c;是直接封装在IP报文中的&#xff0c;协议号为89。 OSPF本身5种类型&#xff1a;分别是Hello报文、DD报文、LSR报文、LSU报文、LSAck报文&#xff0c;各种不同类型的LSA其实只是包含…

Acitity跳转延时10s会导致anr的时序问题讨论

背景&#xff1a; 针对前些天直播时候&#xff0c;主要讲解是launcher启动app&#xff0c;Activity onResume延时10s不会anr&#xff0c;但是Activity内部activity1跳转activity2就会anr问题展开了讨论 https://mp.weixin.qq.com/s/_uA5yKUTUw-9H-tWxGNK9g 这个原因为啥已经在…