索引 Index -- 快速查找数据

文章目录

    • 1. 为什么需要索引
    • 2. 索引的需求定义
      • 2.1 功能性需求
      • 2.2 非功能性需求
    • 3. 构建索引常用的数据结构
    • 4. 总结

索引这种常用的技术解决思路,底层往往会依赖哪些数据结构?

1. 为什么需要索引

实际的软件开发中,它们的本质都可以抽象为“对数据的存储和计算”。

  • 存储,增删改查。一旦存储的数据很多,性能就成了关注的重点
  • “如何节省存储空间、提高数据增删改查的效率”,是设计的重点。不夸张地说,索引设计得好坏,直接决定了这些系统是否优秀

2. 索引的需求定义

2.1 功能性需求

  • 数据是格式化数据还是非格式化数据?要构建索引的原始数据,类型有很多。分为两类,一类是结构化数据,比如,MySQL数据;另一类是非结构化数据,比如网页。对于非结构化数据,需要做预处理,提取出查询关键词,对关键词构建索引。

  • 数据是静态还是动态?如果原始数据是静态数据,不会有数据的增加、删除、更新操作,所以,在构建索引的时候,只需要考虑查询效率就可以了。大部分情况下,我们都是对动态数据构建索引,不仅要考虑到索引的查询效率,还需要动态更新索引。

  • 索引存储在内存还是硬盘?存储在内存,查询速度比磁盘高。索引大的时候,内存有限,可能不得不将索引存在磁盘中。还可以一部分存在内存,一部分存在磁盘,兼顾内存消耗和查询效率。

  • 单值查找还是区间查找

  • 单关键词查找还是多关键词组合查找?比如,搜索引擎中构建的索引,既要支持一个关键词的查找,比如“数据结构”,也要支持组合关键词查找,比如“数据结构 & 算法”。对于多关键词查询来说,要分多种情况。像MySQL这种结构化数据的查询需求,可以实现针对多个关键词的组合,建立索引;对于像搜索引擎这样的非结构数据的查询需求,可以针对单个关键词构建索引,然后通过集合操作,比如求并集、求交集等,计算出多个关键词组合的查询结果。

2.2 非功能性需求

  • 不管是存在内存中还是磁盘中,索引对存储空间的消耗不能过大

  • 考虑索引查询效率的同时,还要考虑索引的维护成本。索引的目的是提高查询效率,但是,基于动态数据集合构建的索引,还要考虑索引的维护成本。因为在原始数据动态增删改的同时,也需要动态的更新索引。而索引的更新会影响到增删改操作的性能。

3. 构建索引常用的数据结构

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

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

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

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

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

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

  • 有序数组也可被作为索引。如果数据是静态的,可以把数据的关键词抽取出来,组织成有序数组,然后利用二分查找来快速查找数据。

4. 总结

架构设计离不开数据结构和算法。要想成长为一个优秀的业务架构师、基础架构师,数据结构和算法的根基一定要打稳。那些看似很惊艳的架构设计思路,实际上,都是来自最常用的数据结构和算法。

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

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

相关文章

Tensorflow实现MLP

多层感知机(MLP)作为最典型的神经网络,结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数。本文将利用 MLP 实现手写数字分类的任务。 结构:   784个输入层神经元 – 200个隐层神经元 –…

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑 性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优、数据库、JVM调优、架构调优等方案。 第一:Web网站调优 1、尽可能减少HTTP请求:图片合并 (cs…

知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术部门介绍搜索算法团队是知乎核心算法团队之一,负责知乎搜索框背后的各项算法工作。我们团队一直非常重视新技术在搜索场景的探索和落地,包括但不限于 NLP,排序,…

并行算法 Parallel Algorithm -- 提高执行效率

文章目录1. 并行排序2. 并行查找3. 并行字符串匹配4. 并行搜索5. 总结时间复杂度是衡量算法执行效率的一种标准。但是,时间复杂度 ! 性能。即便在不降低时间复杂度的情况下,也可以通过一些优化手段,提升代码的执行效率。即便是像10%、20%这样…

论文浅尝 | 主题感知的问答生成

Citation: XingC, Wu W, Wu Y, et al. Topic aware neural response generation[C]//Thirty-FirstAAAI Conference on Artificial Intelligence. 2017.动机人机对话在 AI 和 NLP 领域是一项具有挑战性的工作。现存的对话系统包括任务导向的对话系统和非任务导向的聊天机器人。在…

集成学习(西瓜书学习)

集成学习概述一、Boosting1、Boosting2、GBDT (Gradient Boosting Decision Tree)3、XGBoost(Extreme Gradient Boosting)二、Bagging 与 Random Forest1、Bagging2、RF(Random Forest)概述 集成学习&…

爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件

一:爬取词库,使用jieba分词库,自定义dict.txt文件 import jiebafrom urllib.request import urlopen from bs4 import BeautifulSoup# 来源于地图搜索数据,按照网民输入习惯精心筛选使用较多的词条。包含城市地名、公交、购物、餐…

.halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 网络安全是当今数字时代的一大挑战,各种勒索病毒如.halo病毒层出不穷,对用户和企业的数据安全构成了严重威胁。本文将介绍.halo勒索病毒,以及如何恢复被其加密的数据文件,同时提供预防措施。在面对被勒索…

阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈&#xf…

周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...

近年来,机器学习技术的快速发展推动了语音、自然语言处理、机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展。回顾机器学习最近30 年的发展历程,各种学习方法推陈出新、不断演进。但是,在此历程中&#xff0c…

Redis常用数据类型的数据结构

文章目录1. Redis 数据库介绍2. 列表(list)3. 字典(hash)4. 集合(set)5. 有序集合(sortedset)6. 数据结构持久化7. 总结1. Redis 数据库介绍 Redis 是一种键值( Key-Val…

python 异常处理相关说明

Python异常及处理方法总结: https://blog.csdn.net/polyhedronx/article/details/81589196?depth_1- .tar(是打包操作,不是压缩) 解包:tar -xvf FileName.tar 打包:tar -cvf FileName.tar DirName —————————…

论文浅尝 | 使用循环神经网络的联合事件抽取

余博涛,南京大学计算机科学与技术系,硕士研究生论文连接:http://www.aclweb.org/anthology/N16-1034发表会议:NAACL-HLT 2016摘要事件抽取(event extraction)是信息抽取中一个特别具有挑战性的问题。针对该…

阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等。 1.浏览器访问优化 (1)减少http…

决策树(西瓜书学习)

算法是死的,思想才是活的! 1. 基本流程 决策树(decision tree):一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个…

动手做个DialoGPT:生成式多轮对话模型

文 | 苏剑林编 | 兔子酱前段时间刷Arixv的时候,发现清华大学开源了一个大规模的中文闲聊语料库LCCC,从开源的文件上来看,这可能是目前开源的数量最大、质量最好的闲聊语料库了,而且还包含了部分多轮对话聊天,总的来说可…

搜索引擎背后的数据结构和算法

文章目录1. 整体系统介绍2. 搜集2.1 待爬取网页链接文件:links.bin2.2 网页判重文件:bloom_filter.bin2.3 原始网页存储文件:doc_raw.bin2.4 网页链接及其编号的对应文件:doc_id.bin3. 分析3.1 抽取网页文本信息3.2 分词并创建临时…

mysql: order by, group by ,having, select, where 执行 顺序

where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。 group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合&#x…

论文浅尝 | DKN: 面向新闻推荐的深度知识感知网络

笔记整理:仲亮靓,东南大学硕士研究生,研究方向是基于知识图谱的推荐系统动机新闻文本的语言非常凝练,其中包含了很多实体和常识知识。但目前的新闻个性化推荐方法都没有利用这些外部知识,也没有使用新闻之间潜在的知识…

聊聊工业界做机器学习的里程碑

文 | 吴海波编 | YY阅读说明,本文的机器学习领域限制于互联网搜索、推荐、广告场景,仅限于个人观点。2017年,我和团队的几个核心去了趟北京,找了各大互联网公司一线实战的同学,交流各自在机器学习上的经验。这次交流让…