热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据即时计算产品的一般原理索引

一、基本概念       索引相信大家多多少少都接触过,索引的目的说白了就是加快数据的检索、排序和计算等,尤其是对于海量数据的快速检索,索引起到了至关重要的

一、基本概念

      索引相信大家多多少少都接触过,索引的目的说白了就是加快数据的检索、排序和计算等,尤其是对于海量数据的快速检索,索引起到了至关重要的作用。大家都知道,我们基于传统数据库开发经常会遇到一个问题,就是这个SQL查询变慢,是不是索引没加?数据库的索引好比一本书前面的目录,如果明确知道按哪个字段来进行索引查找,查询效率还是挺高的,数据库的索引实际上是一个单独的、物理的数据库结构, 它是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单,但是大家一定要注意,并不是所有的数据库索引都能提升查询性能,毕竟传统数据库主要还是面向事务的,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,而创建索引和维护索引却要耗费时间,这种时间随着数据量的增加而增加,并且每一个索引还需要占用存储空间,所以事务型关系数据库经常会考虑平衡修改性能和查询性能,灵活度受限,甚至需要专门的DBA来进行REVIEW。而对于数据仓库的应用来说主要还是以读为主,而对于查询条件的灵活度以及查询响应结果的速度要求还是蛮高的,特别是对于OLAP应用,查询条件维度灵活组合,另外还经常有类似于LIKE这样的模糊查询,大家可以想象一下,这在关系数据库在面临海量数据检索时是很难进行支撑,光是索引也还是很难建的。所以现在大家对于大数据场景下的检索一定会想到LUCENE,关于LUCENE的技术知识,这里就不展开多讲,ATA就有很多文章介绍,我这里主要摘出LUCENE索引的两个重要的概念:

1、倒排索引:
又称反向索引,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。倒排索引由词典和倒排表组成,字典是由索引词组成的索引表,而倒排表则由每个索引词出现过的文档集合,以及命中位置等信息组成的记录表。如图所示:

在处理复杂的多关键字查询时,可在倒排表中先完成查询的交、并等逻辑运算,得到结果后再对记录进行存取。这样不必对每个记录随机存取,把对记录的查询转换为地址集合的运算,从而提高查找速度!

2、正排索引:
也称前向索引,主要由正排表组成,正排表中每条记录表示一个文档的属性集合,以文档ID 为主键,表中每个记录的索引字段记录了文档的每个属性字段的值。正排表/属性(Attribute) 主要用来进行过滤,统计,rank/排序.在一次查询中,倒排表集合运算后的文档集合中的每个文档后续都需要访问其相应的正排表/属性(Attribute)数据,来进行过滤,统计,算分,排序等,所以正排表/属性(Attribute)访问速度需要非常快,通常需要常驻内存。


二、索引对于大数据即时分析型数据库的好处

  • 倒排索引对于大数据检索的支持非常灵活和高效,基于倒排索引的过滤不需要进行大量的IO扫描(用于sql的 where过滤)。
  • 可以利用倒排表的词频统计信息,快速用于求COUNT查询,百亿数据10台机器百毫秒级别响应。
  • 倒排索引容易压缩,特别对于重复值比较多的情况下,压缩程度非常高,极大减少IO,另外倒排表本身采用了delta存储,比如说第一个值为 xiaogu12353,第二个值为xiaogu12354,那么仅仅存储他们的差异即可。
  • 正排索引技术可以很方便实现对于GROUPBY的字段进行编号,比如按国家名称来统计PV,可以将国家全称的长文本信息统一编号为int型数值代号,将极大节省IO。

三、索引技术在大数据即时计算中的运用

上段基本描述了索引至于大数据即时计算带来了诸多的好处,那么实际索引技术又是在大数据即时计算哪些技术环节进行了使用?我总结了下HIGO和GARUDA(有些YY),大体都是这样一个基本流程:

 
HIGO本身是基于lucene和Solr开发,所以在数据检索和统计上完全依赖于Lucene的倒排索引和正排索引,用户输入一个term(词),通过倒排索引快速获取docIdList,然后通过正排索引获取docId->Field文件存储的位置,具体是fdt和fdx文件,出于性能考虑,很多Field的值都以FieldValueCache的形式载入到内存里进行统计计算,缓存的构造也充分利用索引文件可压缩可转编码转换处理的特性,极大节省了存储容量和IO。GARUDA目前也自己实现了一套倒排索引和正排索引,大概计算流程如下图所示:

从上图可以看到通过倒排索引可以找到term->rowIds,再从正排找到rowId->columns(列存储位置),再进行过滤、统计、聚合最终返回结果,大致的流程也差不多。

   最后总结一下,索引技术之于大数据即时计算,除了大幅加快数据的检索速度还显著减少查询中分组、统计,大幅提升系统的性能和响应时间。据了解,腾讯和百度等互联网公司也在积极研发基于大数据索引技术的分析型数据库,所以索引技术也是大数据时代的利器。




推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
author-avatar
张馨桐等你2502895757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有