zoukankan      html  css  js  c++  java
  • 29:索引

    1、在海量数据中快速查找某个数据

    2、为什么需要索引

    业务和功能的本质==》“对数据的存储和计算”==》存储:数据结构;计算:算法

    一旦存储的数据很多,那性能就成了这些系统要关注的终点,特别是在一些跟存储相关的基础系统(比如MySQL数据库、分布式文件系统等)、中间件(比如消息中间件RocketMQ等)中

    如何节省存储空间、如何提高数据增删改查的执行效率==》索引

    3、索引的功能性需求

    数据是格式化数据还是非格式化数据==》结构化数据比如MySQL中的数据;非结构化数据比如搜索引擎中网页。对于非结构化数据,一般需要做预处理,提取出查询关键词,对关键词构建索引

    数据是静态数据还是动态数据==》如果原始数据是一组静态数据,也就是说,不会有数据的增加、删除、更新操作,所以,在构建索引的时候,只需要考虑查询效率就可以了;对动态数据构建索引,不仅要考虑到索引的查询效率,在原始数据更新的同时,还需要动态地更新索引

    索引存储在内存还是硬盘==》存储在内存中;存储在磁盘中;一部分存储在内存,一部分存储在磁盘

    单值查找还是区间查找==》单值,查询关键词等于某个值的数据;区间,查找关键词处于某个区间值的所有数据

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

    4、索引的非功能性需求

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

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

    5、构建索引常用的数据结构

    散列表、红黑树、跳表、B+树;位图、布隆过滤器可以作为辅助索引;有序数组可以用来对静态数据构建索引

    散列表==》增删改查O(1)==》键值数据库比如Redis、Memcache,使用散列表来构建索引,这类索引,一般都构建在内存中

    红黑树==》插入、删除、查找O(logn)==》也非常适合用来构建内存索引,Ext文件系统中,对磁盘块的索引

    B+树==》更加适合构建存储在磁盘中的索引==》B+ 树是一个多叉树,所以,对相同个数的数据构建索引,B+ 树的高度要低于红黑树。当借助索引查询数据的时候,读取 B+ 树索引,需要的磁盘 IO 次数会更少。

    跳表==》支持快速添加、删除、查找数据==》通过灵活调整索引节点个数和数据个数之间的比例,可以很好地平衡索引对内存的消耗及其查询效率;Redis中的有序集合

    位图和布隆过滤器==》辅助存储在磁盘中的索引,加速数据查找的效率==》布隆过滤器,加速数据不存在的情况

    有序数组==》静态数据,二分查找

  • 相关阅读:
    第四章:运算符与表达式——参考手册笔记
    第三章:类型与对象——参考手册笔记
    Python书单
    第二章:词法约定——参考手册笔记
    第5章:分治法——《算法笔记
    第4章:减治法——《算法笔记
    第3章:蛮力法——《算法笔记
    第2章:算法效率分析——《算法笔记
    算法书单
    第1章:绪论:基本数据结构——《算法设计与分析基础》笔记
  • 原文地址:https://www.cnblogs.com/liushoudong/p/13509789.html
Copyright © 2011-2022 走看看