亲测可用,若有疑问请私信

在【B+树】:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理。MySQL底层依赖的是B+树这种数据结构。那类似Redis这样的Key-Value数据库中的索引,又是怎么实现的呢?底层依赖的有是什么数据结构呢

今天,我们来讲一下索引这种常用的技术解决思路,底层往往会依赖哪些数据结构。同时,通过索引这个应用场景,我也带你回顾一下,之前我们学过的几种支持动态集合的数据结构。


为什么需要索引?

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

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

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

索引这个概念,非常好理解。可以类比书籍的目录来理解。通过目录我们可以快速定位相关知识点的页数,查找的速度也会有质的提高。


索引的需求定义

对于系统设计需求,我们一般可以从功能性需求非功能性需求两方面来分析。

1.功能性需求

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

数据是静态数据还是动态数据?如果原始数据是一组静态数据,也就是说,不会有数据的增加、删除、更新操作,那么我们在构建索引的时候只需要考虑查询效率就可以了。这样索引的构建就相对简单些。不过大部分情况下我们都是对动态数据构建索引,也就是说,我们不仅要考虑到索引的查询效率,在原始数据更新的同时,我们还需要动态的更新索引。支持动态数据集合的索引,设计起来相对也要更加复杂些。

索引存储在内存还是硬盘?还有种情况是一部分存储在内存,一部分存储在硬盘,这样可以兼顾内存消耗和查询效率。

单值查找还是区间查找

单关键词查找还是多关键词组合查找?对于单关键词的查找,索引构建起来相对简单些。对于多关键词查询来说,要分多种情况。像MySQL这种结构化数据的查询需求,我们可以实现针对多个关键词的组合,建立索引;对于像搜索引擎这样的非结构数据的查询需求,我们可以针对单个关键词构建索引,然后通过集合操作,比如求并集、求交集等,计算出多个关键词组合的查询结果。

2. 非功能性需求

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

在考虑索引查询效率的同时,我们还要考虑索引的维护成本。即动态的更新索引的成本。


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

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

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

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

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

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

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

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

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


课后思考

你知道基础系统、中间件、开源软件等系统中,有哪些用到了索引吗?这些系统的索引是如何实现的?

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

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

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 前面讲过MySQL数据库索引实现原理,底层是依赖B+树这种数据结构来实现的.那类似Redisp 这 ...

  2. php对pdf关键字定位,如何在PDF文件中快速查找关键字

    有时候我们在阅读和编辑PDF文章时需要对PDF文件里的重要关键词进行查找,但如果PDF文章内容过长,怎么才能快速查找出想要查找的关键字? 想要在PDF文件中快速查找出关键字,那么利用迅捷PDF编辑器进 ...

  3. Cadence OrCAD原理图中快速查找元件的方法

    Cadence OrCAD原理图中快速查找元件和网络方法 本章节将教大家如何在OrCAD原理图中根据元件位号快速查找元件的两个方法. 方法一:在.obj页面的"File"标签下查找 ...

  4. matlab换挡程序,一种基于MATLAB换挡过程中快速锁定分析数据的方法与流程

    本发明涉及汽车变速器数据分析,特别的,涉及一种基于matlab换挡过程中快速锁定分析数据的方法. 背景技术: 自动变速器的核心功能是能根据驾驶员意图进行自动换挡,解放驾驶员的左脚:在自动变速器的使用过 ...

  5. 如何在 Windows 中快速查找文档

    近几年,随着硬盘介质价格的大幅度下降,各位电脑迷们的个人硬盘容量越来越大,动辄五六十G,甚至上百G都不足为奇,这在前几年是无法想象的.但是硬盘大了,存放的文档多了,查找速度慢的烦恼也随之来了.其实在W ...

  6. centos7 vim查找_如何在 Vim/Vi 中快速查找和替换文本内容

    Vim 是 Vi 多模式命令行编辑器的加强版,通常默认的Unix或Linux系统中都默认自带Vi命令编辑器.当然,为了更好的体验,如果系统默认没有安装Vim,建议安装Vim. 通过本文的讲解,你将学会 ...

  7. 在字符串中 快速查找

    最近更新:28th 十二月, 2016 很多时候,我们需要在字符串中执行查找,以判断过滤指定的内容出来.比如过在落格输入法当中,就需要用辅码过滤出需要的候选词. 一般来说,查找和对比肯定是数字来的最快 ...

  8. 海量数据:快速查找一个数字是否出现在40亿个数字中

    腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 看到问题的想法是采用bitmap:1个字节可以表示8个整数是否出现 ...

  9. python寻峰算法_在python中快速查找峰和质心

    我正在尝试在python中开发一种快速算法,以查找图像中的峰值,然后找到这些峰值的质心.我使用scipy.ndimage.label和ndimage.find_objects编写了以下代码来查找对象. ...

最新文章

  1. Struts2入门这一篇就够了
  2. 论文笔记:N-BEATS: NEURAL BASIS EXPANSION ANALYSIS FORINTERPRETABLE TIME SERIES FORECASTING
  3. qt获取当前场景中的所有图形项的层次
  4. asp.net文件上传进度条控件(破解版~没时间限制)多项自定义 .
  5. 计算机科学与技术收获,工作人员参加计算机科学与技术在职研究生学习收获大吗?...
  6. 【超全教程】SpringBoot 2.3.x 分层构建 Docker 镜像实践
  7. html5 ie10支持,ie10支不支持html5|Internet Explorer10完美支持HTML5_好特教程
  8. 42. HTTP Cookie
  9. c/c++ 基本线程管理 join detach
  10. OCR条形码控件字体支持多种格式的OCR字体
  11. 微信公众号首次关注自动回复图文消息
  12. 开源镜像站最新动态20150626
  13. Davinci的异构多核间通信基础组件SysLink
  14. HCIP第九天笔记(OSPF的路由回馈、路由策略、以及配置指南)
  15. 计算机硬盘大小及区分数怎么看,一分钟解读:教你如何看SSD测试成绩
  16. mysql安装简书_MySQL 安装和配置
  17. mac 读取linux分区,Paragon extFS for mac下载-Mac读写Linux分区工具Paragon extFS下载v11.2.16 官方版__西西软件下载...
  18. 编译设备树时报错“arch/arm/boot/dts/imx50.dtsi:14:42:致命错误:dt-bindings/clock/imx5-clock/h:没有那个文件或目录”
  19. 单片机c语言程序开发洗衣机,基于51单片机的洗衣机程序
  20. 2013汇总计算 广联达gcl_广联达钢筋算量GGJ2013快捷操作汇总

热门文章

  1. 软件设计之——高内聚低耦合
  2. 电子元件知识汇总4-采购
  3. 项目成功经验分享:做好项目承诺管理
  4. web网页设计实例作业~~主题是花盆售卖网页(HTML+CSS+JavaScript)
  5. mysql数据库的授权访问
  6. matlab薄板屈曲,第六章 薄板的屈曲.doc
  7. 为了健康,将你的身体从酸性变为碱性
  8. 抖音直播间流量如何提高?抖音直播间停留怎么提高
  9. GUI(图形界面编程)
  10. html中图片保持原比例自适应div大小