怎么从海量数据中快速查找某个数据:索引

数据结构与算法50丨索引:如何在海量数据中快速查找某个数据? 索引的概念不难理解,我想你应该已经搞明白。接下来,我们就分析一下,在设计索引的过程中,需要考虑到的一些因素,换句话说就是,我们该如何定义清楚需求呢?对于系统设计需求,我们一般可以从功能性需求和非功能性需求两方面来分析,这个我们之前也说过。因此,这个问题也不例外。今天这节算是一节总结课。我从索引这个非常常用的技术方案,给你展示了散列表、红黑树、跳表、位图、布隆过滤器、有序数组这些数据结构的应用场景。学习完这节课之后,不知道你对这些数据结构以及索引,有没有更加清晰的认识呢? 阅读详情

MySQL 底层依赖的是 B+ 树这种数据结构。

那类似 Redis 这样的 Key-Value 数据库中的索引,又是怎么实现的呢?底层依赖的又是什么数据结构呢?

索引这种常用的技术解决思路,底层往往会依赖哪些数据结构。同时,通过索引这个应用场景,你学过过或者知道几种支持动态集合的数据结构呢?

为什么会使用到索引?

在实际的软件开发中,业务纷繁复杂,功能千变万化,但是,万变不离其宗。如果抛开这些业务和功能的外壳,其实它们的本质都可以抽象为“对数据的存储和计算”。对应到数据结构和算法中,那“存储”需要的就是数据结构,“计算”需要的就是算法。

对于存储的需求,功能上无外乎增删改查。这其实并不复杂。但是,一旦存储的数据很多,那性能就成了这些系统要关注的重点,特别是在一些跟存储相关的基础系统(比如 MySQL 数据库、分布式文件系统等)、中间件(比如消息中间件 RocketMQ 等)中。

“如何节省存储空间、如何提高数据增删改查的执行效率”,这样的问题就成了设计的重点。而这些系统的实现,都离不开一个东西,那就是索引。不夸张地说,索引设计得好坏,直接决定了这些系统是否优秀。

索引这个概念,非常好理解。面试很多人会说类比书籍的目录来理解(面试不要在这么说了,太low了,说是数据结构就行了)。

索引的需求定义

索引的概念不难理解,但在设计索引的过程中,需要考虑到的一些因素,对于系统设计需求,一般可以从功能性需求和非功能性需求两方面来分析。

功能性需求

对于功能性需求需要考虑的点,大致概括成下面这几点。

  • 数据是格式化数据还是非格式化数据?要构建索引的原始数据,类型有很多。我把它分为两类,一类是结构化数据,比如,MySQL 中的数据;另一类是非结构化数据,比如搜索引擎中网页。对于非结构化数据,一般需要做预处理,提取出查询关键词,对关键词构建索引。
  • 数据是静态数据还是动态数据?如果原始数据是一组静态数据,也就是说,不会有数据的增加、删除、更新操作,所以在构建索引的时候,只需要考虑查询效率就可以了。这样,索引的构建就相对简单些。不过,大部分情况下,都是对动态数据构建索引,也就是说,不仅要考虑到索引的查询效率,在原始数据更新的同时,还需要动态地更新索引。支持动态数据集合的索引,设计起来相对也要更加复杂些。
  • 索引存储在内存还是硬盘?如果索引存储在内存中,那查询的速度肯定要比存储在磁盘中的高。但是,如果原始数据量很大的情况下,对应的索引可能也会很大。这个时候,因为内存有限,可能就不得不将索引存储在磁盘中了。实际上,还有第三种情况,那就是一部分存储在内存,一部分存储在磁盘,这样就可以兼顾内存消耗和查询效率。
  • 单值查找还是区间查找?所谓单值查找,也就是根据查询关键词等于某个值的数据。这种查询需求最常见。所谓区间查找,就是查找关键词处于某个区间值的所有数据。你可以类比 MySQL 数据库的查询需求,自己想象一下。实际上,不同的应用场景,查询的需求会多种多样。
  • 单关键词查找还是多关键词组合查找?比如,搜索引擎中构建的索引,既要支持一个关键词的查找,比如“数据结构”,也要支持组合关键词查找,比如“数据结构 AND 算法”。对于单关键词的查找,索引构建起来相对简单些。对于多关键词查询来说,要分多种情况。像 MySQL 这种结构化数据的查询需求,可以实现针对多个关键词的组合,建立索引;对于像搜索引擎这样的非结构数据的查询需求,可以针对单个关键词构建索引,然后通过集合操作,比如求并集、求交集等,计算出多个关键词组合的查询结果.

实际上,不同的场景,不同的原始数据,对于索引的需求也会千差万别。这里只列举了一些比较有共性的需求。

非功能性需求

再来看索引设计的非功能性需求。

  • 不管是存储在内存中还是磁盘中,索引对存储空间的消耗不能过大。如果存储在内存中,索引对占用存储空间的限制就会非常苛刻。毕竟内存空间非常有限,一个中间件启动后就占用几个 GB 的内存,开发者显然是无法接受的。如果存储在硬盘中,那索引对占用存储空间的限制,稍微会放宽一些。但是,也不能掉以轻心。因为,有时候,索引对存储空间的消耗会超过原始数据。
  • 在考虑索引查询效率的同时,还要考虑索引的维护成本。索引的目的是提高查询效率,但是,基于动态数据集合构建的索引,还要考虑到,索引的维护成本。因为在原始数据动态增删改的同时,也需要动态地更新索引。而索引的更新势必会影响到增删改操作的性能。

构建索引常用的数据结构有哪些?

从很宏观的角度,总结了在索引设计的过程中,需要考虑的一些共性因素。现在,对于不同需求的索引结构,底层一般使用哪种数据结构。

实际上,常用来构建索引的数据结构,几种支持动态数据集合的数据结构。比如,散列表、红黑树、跳表、B+ 树。除此之外,位图、布隆过滤器可以作为辅助索引,有序数组可以用来对静态数据构建索引。

散列表增删改查操作的性能非常好,时间复杂度是 O(1)。一些键值数据库,比如 Redis、Memcache,就是使用散列表来构建索引的。这类索引,一般都构建在内存中。

红黑树作为一种常用的平衡二叉查找树,数据插入、删除、查找的时间复杂度是 O(logn),也非常适合用来构建内存索引。Ext 文件系统中,对磁盘块的索引,用的就是红黑树。

B+ 树比起红黑树来说,更加适合构建存储在磁盘中的索引。B+ 树是一个多叉树,所以,对相同个数的数据构建索引,B+ 树的高度要低于红黑树。当借助索引查询数据的时候,读取 B+ 树索引,需要的磁盘 IO 次数会更少。所以,大部分关系型数据库的索引,比如 MySQL、Oracle,都是用 B+ 树来实现的。

跳表也支持快速添加、删除、查找数据。而且通过灵活调整索引结点个数和数据个数之间的比例,可以很好地平衡索引对内存的消耗及其查询效率。Redis 中的有序集合,就是用跳表来构建的。

除了散列表、红黑树、B+ 树、跳表之外,位图和布隆过滤器这两个数据结构,也可以用于索引中,辅助存储在磁盘中的索引,加速数据查找的效率。

布隆过滤器有一定的判错率。但是可以规避它的短处,发挥它的长处。尽管对于判定存在的数据,有可能并不存在,但是对于判定不存在的数据,那肯定就不存在。而且,布隆过滤器还有一个更大的特点,那就是内存占用非常少。可以针对数据,构建一个布隆过滤器,并且存储在内存中。当要查询数据的时候,可以先通过布隆过滤器,判定是否存在。如果通过布隆过滤器判定数据不存在,那就没有必要读取磁盘中的索引了。对于数据不存在的情况,数据查询就更加快速了。

实际上,有序数组也可以被作为索引。如果数据是静态的,也就是不会有插入、删除、更新操作,那可以把数据的关键词(查询用的)抽取出来,组织成有序数组,然后利用二分查找算法来快速查找数据。

海量数据相似查找系列2 -- Annoy算法 上面一章说了下高维稀疏数据如何通过learning to hash的方法来进行相似查找,这种主要想说下另外一种情况,稠密向量如何进行快速相似查找呢?还是以文本为例吧。之前提到过文本的paragraph2vector的向量表示,以及词word2vector向量表示形式。一旦文档变成这种稠密向量形式,那如何从海量文本中快速查找出相似的Top N 文本呢? 所以这里重点想说下Annoy(Approximate Nearest Neighbors Oh Yeah)这个快速算法,这个在实际应用中发现无论计算速度和准确 阅读详情

相关推荐

索引:如何在海量数据中快速查找某个数据?

在海量数据中快速查找某个数据是一个具有挑战性的问题,而索引是解决这个问题的有效手段。通过选择合适的索引类型,并根据数据的特点和查询需求进行优化,我们可以在海量数据中实现快速查找,提高数据处理的效率。希望本文能够帮助你更好地理解如何在海量数据中利用索引进行快速查找。

yonggeit的博客 3265

海量数据下,如何快速查找一条记录?

一、 使用布隆过滤器(0,1)快速过滤不存在的记录 使用Redis中的bitmap结构来实现布隆过滤器 二、在Redis中建立数据缓存 使用字符串来的形式来存储(userid->user.json) 使用hash来存储一条记录 一个hash最多能存储2^32-1个key(40多个亿键值对) 缓存击穿:对于不存在的数据也建立key,这些key都是经过布隆过滤器过滤的,一般不会太多 缓存过期:将热点数据设置成永不过期,定期重建缓存,使用Redis分布式锁重建缓存 三、查询优化 按槽位分配数据,自

木落 991

现代控制理论(4)——李雅普诺夫稳定性理论

文章目录

wang7301的博客 5万+

从海量数据中查找某个数

从海量数据中查找top K大或者小的数 构建堆 找最大的数前K个构建最小堆,找K个最小的数构建最大堆 如果这些数据是分布在不同的机器上的。 先计算每个机器上的top K , 再使用合并计算整体的top K 如果当前文件是个大文件: 方案1:先构建堆,再遍历进行堆的调整 方案2:分治法: map[分为多个小文件,计算每个topk] reduce[合并汇总] Hash法。 如果这1亿个书里面有很多重复的数,先通过Hash法,把这1亿个数字去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩

weixin_36378508的博客 1050

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 441

AT32F403A ADC采集实战:如何用V2库精准读取可变电阻电压(附完整代码)

本文详细介绍了基于AT32F403A微控制器和V2库实现高精度ADC采集的工程化方法。内容涵盖从基础的单通道轮询配置到多通道扫描与DMA传输的进阶应用,并重点分享了提升ADC采集精度的关键技巧,包括采样时间优化、软件滤波算法以及硬件布局考量,提供了完整的实战代码,帮助开发者解决数据跳动、稳定性等常见问题。

weixin_29189003的博客 92

腾讯面试题:海量数据中查找一个数

腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?这个题目已经有一段时间了,但是腾讯现在还在用来面试。腾讯第一次面试的时候我听面试官问其他人了。我不是故意的。。。

天道酬勤! 8525

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 301

数据结构与算法笔记:高级篇 - 索引:如何在海量数据中快速查找某个数据?

索引的概念不难理解,我想你应该已经搞明白。接下来,我们就分析一下,在设计索引的过程中,需要考虑到的一些因素,换句话说,我们该如何定义清楚需求呢?对于系统设计需求,我们一般可以从功能性需求和非功能性需求两方面来分析。因此,这个问题也不例外。本章是一个总结课。从索引这个非常常用的技术方案,给你展示了散列表、红黑树、跳表、B+ 树、位图、布隆过滤器、有序数组这些数据结构的应用场景。学习完这篇文章后,不知道你对数据结构以及索引,有没有更加清晰的认识呢?

chenjian723122704的专栏 1396

信创迁移实战:在银河麒麟V10-SP1上为Milvus离线部署Docker(附SP1专属避坑指南)

本文详细介绍了在银河麒麟V10-SP1 x86_64环境下离线部署Docker的全流程,特别针对该版本特有的自定义目录安装失败问题提供深度分析和解决方案。通过实战验证的步骤和避坑指南,帮助用户在信创项目中顺利完成Milvus等应用的容器化部署。

weixin_30687051的博客 532

DP83869HM的LWIP性能测试

E:/Xilinx/Vitis/2021.1/data/embeddedsw/ThirdParty/sw_services/lwip211_v2_0/src/contrib/ports/xilinx/netif/xemacpsif_physpeed.c文件中的。然后phy_setup_emacps中调用get_IEEE_phy_speed函数,根据PHY的ID判断出Marvell或TI或Realtek的PHY,调用对应的网速自动协商函数get_TI_phy_speed,该函数中的部分配置需要注释。

FPGA艺术家的博客 356

【索引】:如何在海量数据中快速查找某个数据?

在【B+树】:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理。MySQL底层依赖的是B+树这种数据结构。那类似Redis这样的Key-Value数据库中的索引,又是怎么实现的呢?底层依赖的有是什么数据结构呢? 今天,我们来讲一下索引这种常用的技术解决思路,底层往往会依赖哪些数据结构。同时,通过索引这个应用场景,我也带你回顾一下,之前我们学过的几种支持动态集合的数据结...

南方以北 4560

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1913

50 | 索引:如何在海量数据中快速查找某个数据?

一般可以从功能性需求和非功能性需求两方面来分析。

Balance 768

21、汽车喷漆目标区域识别:机器学习与深度学习的应用

本文探讨了机器学习与深度学习在汽车喷漆目标区域识别中的应用,重点利用卷积神经网络(CNN)提高喷漆效率并减少油漆浪费。通过构建和预处理包含多种汽车类型的数据集,采用ResNet-18、ResNet-50和MobileNet-v2等模型进行训练与评估,结果表明ResNet-50在准确率和鲁棒性方面表现最佳。研究还分析了数据裁剪、标签处理、网络架构差异以及光照和遮挡对识别效果的影响,并提出了系统实现流程。最后,文章展望了多传感器融合、模型优化和场景适应性等未来研究方向,为智能化喷漆工艺提供了技术参考。

5b6n7m8的博客 102

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

50.索引:如何在海量数据中快速查找某个数据

数据是格式化数据还是非格式化数据?要构建索引的原始数据,类型有很多。我把它分为两类,一类是结构化数据,比如,MySQL中的数据;另一类是非结构化数据,比如搜索引擎中网页。对于非结构化数据,我们一般需要做预处理,提取出查询关键词,对关键词构建索引。数据是静态数据还是动态数据?如果原始数据是一组静态数据,也就是说,不会有数据的增加、删除、更新操作,所以,我们在构建索引的时候,只需要考虑查询效率就可以了。这样,索引的构建就相对简单些。

tobebetter9527的博客 839

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?

本节课程思维导图:在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B+ 树这种数据结构。留言里有同学问我,那类似 Redis 这样的 Key-Value 数据库中的索引,又是怎么实现的呢?底层依赖的又是什么数据结构呢?今天,我就来讲一下索引这种常用的技术解决思路,底层往往会依赖哪些数据结构。同时,通过索引这个应用场景,我也带你回顾一下,之前我们学过的几种支持动态集合的数据结构。索引的概念不难理解,我想你应该已经搞明白。

weixin_43597208的博客 1104

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

倒排索引数据结构

摘要:倒排索引的高效检索依赖于FST和位图两种核心数据结构。FST通过前缀压缩实现关键词快速定位,查询复杂度仅与关键词长度相关;位图则利用比特位表示文档集合,支持高速位运算处理多条件查询。两者协同工作:FST首先定位关键词,位图随后处理文档集合运算。FST提供内存高效压缩,位图实现并行计算优势,共同支撑海量数据下的快速检索。这种组合设计平衡了存储效率与计算性能,是搜索引擎实现毫秒级响应的关键技术基础。(149字)

tqs_123456的博客 417

抽象共性:数据库索引原理的推测

这样,查询某个数据项时,也能快速的知道其对应的索引,再根据索引的 分布情况,逐步排除不含 该索引的板块,直到最后 确认 在包含该索引的板块中,再进行查询,这样 由于减少了工作量,查询速度 就得以提升。一是,计算机最底层的二进制原理 极其依赖的基础物理结构 没有发生 变化,二是,索引 和 默认的 查询方法之间 不是并列关系,而是前者 对后者的 一种优化关系。最后,原本无从推测的,索引这一概念,也通过对抽象出来的特性及本质思维的运用,得出了一个能说得通的一种理解方式。而索引正是应对这个问题所采用的方法。

m0_64732120的博客 184

【MySQL进阶之路】为什么索引能快速的在海量数据中查找

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行 正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高 是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个 海量数据的检索速度。本文探讨索引怎么做到海量数据的快速查找。首先要谈IO问题,数据是在磁盘中的,如果要对数据进行增删查改工作,就必须把磁盘的数据加载到内存,操作系统就要和外设交互。

2301_79796701的博客 1943
上一篇: 数据结构基础篇之数组
下一篇: Spring Cloud 新一代网关:Spring Cloud GateWay
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值