29:索引

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

2、为什么需要索引

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

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

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

3、索引的功能性需求

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

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

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

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

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

4、索引的非功能性需求

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

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/liushoudong/p/13509789.html