文章目录

  • 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. 总结

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

索引 Index -- 快速查找数据相关推荐

  1. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?

    B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...

  2. 西门子PLC快速查找数据算法

    一.查找算法 1.当我们在一个 链表 或者 顺序表 中 查找 一个数据元素 是否存在 的时候,唯一的方法就是遍历整个表,这种方法称为 线性枚举.如果这时候,顺序表是有序的情况下,我们可以采用折半的方式 ...

  3. oracle9可以访问8,使用Oracle9i全索引扫描快速访问数据

    为了实现Oracle关于增加SQL优化查询智能的承诺,Oracle9i增强了全索引SQL执行计划以支持基于功能的索引(function-based index).在Oracle8中,SQL优化器添加了 ...

  4. oracle 索引快速全扫描,用Oracle 9i全索引扫描快速访问数据

    为了实现Oracle关于增加SQL优化查询智能的承诺,Oracle9i增强了全索引SQL执行计划以支持基于功能的索引(function-based index).在Oracle 8i中,SQL优化器添 ...

  5. 找出两列数据的差集_excel快速查找数据差异项

    近来在网上看到一则查找两列数据差异项的方法,试着做发现07版的excel根本就没有那个功能,而且设置过程也很麻烦,有那个功夫,不如去网上找函数公式解决.今天给大家分享一下用函数组合公式和自定义函数公式 ...

  6. Android学习笔记(三)之带有侧边索引的快速查找(跟带字母索引查找的通讯录差不多)

    喜欢另辟蹊径的我,在这里废话不多说了,直接上代码和图片了. 效果图如下: 第一步:MainActivity的代码如下: package net.loonggg.test;import java.uti ...

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

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

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

    亲测可用,若有疑问请私信 在[B+树]:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理.MySQL底层依赖的是B+树这种数据结构.那类似Redis这样的Key-Value ...

  9. java怎么判断mysql中是否存在我们查找的索引_10张图告诉你,MySQL 是如何查找数据的?...

    在我们日常生活中经常会涉及到查找某个东西的场景,就比如说在一个学校里吧,我们想找出个子"最高的10个"同学,或者想查找姓名是"张三"的同学,又或者是查找学号是& ...

最新文章

  1. 消除图片在ie中缓存而无法更新的问题
  2. 深入浅出Java微服务视频
  3. AC日记——Red and Blue Balls codeforces 399b
  4. 【深度学习】caffe 中的一些参数介绍
  5. ubuntu18系统搭建ftp服务器详解
  6. 租用境外服务器开设网站,租用境外服务器对网站SEO有影响么?影响在那里?
  7. Ubuntu 下的根目录为
  8. Microsoft Visual C++ 修复工具
  9. 一阶惯性加纯滞后模型matlab代码,基于西门子工业软件的仿真系统设计-一阶惯性加纯滞后对象 - 百度(精)...
  10. scikit-learn功能大全
  11. 使用Travis CI进行在线build
  12. SAP中Exchange rate type EURX到底干嘛用的
  13. 人民币对美元汇率中间价报6.7941元 下调139个基点
  14. python系统运维工程师_系统运维工程师的工作职责
  15. 苹果发布iOS10.2.1 ,别升级!别问为什么
  16. 前端表单神器form-create,复杂表单轻松搞定
  17. ACK((Acknowledge character)应答机制(kafka)
  18. 安全专家:50% 的服务器在补丁发布后,很长时间未修复
  19. 直播预告|5月26日14:00 AAAI 专场三
  20. 斯蒂夫乔布斯传 读后感

热门文章

  1. python类介绍_面向对象 Python的类 介绍
  2. matlab里数组的赋值,arrays – MATLAB结构赋值数组
  3. java 中violate_Java中的volatile关键字及Cache更新
  4. mysql中下杠怎么打_怎么打字母下方的短横杠?,下横杠怎么打
  5. 12 哈希表相关类——Live555源码阅读(一)基本组件类
  6. sql server :distinct 与order by 一起使用要注意
  7. Flash 与数学:圆的切线(3)
  8. NHibernate之旅(4):探索查询之条件查询(Criteria Query)
  9. 芯片公司急聘嵌入式软件精英人才
  10. linux platform 驱动模型分析