一种索引建立方法及设备与流程

文档序号:12596309阅读:247来源:国知局
一种索引建立方法及设备与流程

本发明涉及通信技术领域,特别涉及一种索引建立方法,本申请同时还涉及一种索引建立设备。



背景技术:

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引提供指向存储在表的指定列中的数据值的指针,然后根据用户指定的排序顺序对这些指针排序。当需要在数据库中使用索引时,首先搜索索引以找到特定值,然后顺指针找到包含该值的行。

随着互联网技术的不断发展,人们每天通过互联网的活动将产生海量的数据,在将这些海量的数据进行存储之后,如何从中快速检索需要的数据成为了技术人员首要考虑的问题。传统数据库的索引都是需要用户自己指定索引类型,然而同一种索引类型在面对不同的数据类型时的查询时间也是不一样的,所以当索引类型设置不当的情况下,用户在数据库的查询时间将会变得十分漫长,从而给用户带来的不良的使用体验。

在实现本申请的过程中,发明人发现现有技术存在着以下缺陷:

(1)现有索引类型单一,导致某些场景查询性能差。

传统数据的索引类型较为单一、以B-Tree(B树)索引为主,并不是所有数据特征都适合B-Tree索引,比如Key-Value(键-值)模式查找速度很慢。在带有Join(联接)的SQL(Structured Query Language,结构化查询语言)中,一条SQL会进行多次查找。如果采用B-Tree查找的话严重影响join SQL的性能。

(2)通过人工分析日志优化索引,导致可运维性差。

传统数据库在大量数据的场景下,索引带来的维护开销是很大,因此需要每天晚上看下用户访问的日志来决定哪些列增加新索引、哪些列不需要索引、以及哪些列联合起来建组合索引。这种利用历史统计(HBO)自动调整索引类型完全是人工的,使得可运维性很差。

由此可见,如何结合数据库的使用情况为其中各列建立合适的索引,以提高数据检索效率以及减少运维资源,成为本领域技术人员亟待解决的技术问题。



技术实现要素:

本发明提供了一种索引建立方法。用以对索引建立流程进行优化,在提高数据检索效率的同时减少人力的消耗,该方法包括以下步骤:

根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引;

若确定需要为所述列建立索引,根据所述列的数据信息确定索引类型,并按照所述索引类型为所述列建立索引。

优选地,还包括:

若确定无需为所述列建立索引,在所述时间阈值后根据所述列在所述时间阈值内的索引使用状况信息确定是否需要为所述列建立索引。

优选地,根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引,具体为:

获取所述列在所述时间阈值内的所述索引状态信息;

根据所述索引状态信息判断所述列在所述时间阈值内是否使用索引,并在判断结果为是时判断所述列在所述时间阈值内使用索引的次数是否不小于预设的次数阈值;

若所述列在所述时间阈值内未使用索引或所述列在在所述时间阈值内使 用索引的次数小于所述次数阈值,确认无需为所述列建立索引;

若所述列在在所述时间阈值内使用索引的次数不小于所述次数阈值,确定需要为所述列建立索引。

优选地,所述索引类型至少包括B-Tree索引、Hash索引、Bitmap索引,根据所述列的数据信息确定索引类型,具体为:

若所述列为连续型数值类型,确定所述索引类型为所述B-Tree索引;

若所述列会发生Join,确定所述索引类型为所述Hash索引;

若所述列的词数大于预设的词数阈值,确定所述索引类型为倒排索引;

若所述列词数不大于预设的词数阈值,且不会发生Join以及非连续型数值类型,确定所述索引类型为所述位图索引。

优选地,还包括:

当接收到用户发送的检索表达式时,将所述检索表达式拆分为多个子表达式;

在缓存中查询是否存在与各所述子表达式对应的检索结果;

若存在与所述子表达式对应的检索结果,根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应;

若不存在与所述子表达式对应的检索结果,利用所述列的索引对所述子表达式进行检索,并在根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应之后,将检索结果存储与所述缓存。

优选地,在根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引之前,还包括:

当所述数据库初始化完成后,按照默认的索引类型为所述数据库中的各个列构建索引,并在达到预设的时刻重新为各所述列构建索引。

相应地,本申请还提出了一种索引建立设备,包括:

确定模块,根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引;

建立模块,在所述确定模块确定需要为所述列建立索引时根据所述列的数据信息确定索引类型,并按照所述索引类型为所述列建立索引。

优选地,所述建立模块,还在所述确定模块确定无需为所述列建立索引时,在所述时间阈值后根据所述列在所述时间阈值内的索引使用状况信息确定是否需要为所述列建立索引。

优选地,所述确定模块具体用于:

获取所述列在所述时间阈值内的所述索引状态信息;

根据所述索引状态信息判断所述列在所述时间阈值内是否使用索引,并在判断结果为是时判断所述列在所述时间阈值内使用索引的次数是否不小于预设的次数阈值;

若所述列在所述时间阈值内未使用索引或所述列在在所述时间阈值内使用索引的次数小于所述次数阈值,确认无需为所述列建立索引;

若所述列在在所述时间阈值内使用索引的次数不小于所述次数阈值,确定需要为所述列建立索引。

优选地,所述索引类型至少包括B-Tree索引、Hash索引、Bitmap索引,所述建立模块根据所述列的数据信息确定索引类型,具体为:

若所述列为连续型数值类型,确定所述索引类型为所述B-Tree索引;

若所述列会发生Join,确定所述索引类型为所述Hash索引;

若所述列的词数大于预设的词数阈值,确定所述索引类型为倒排索引;

若所述列词数不大于预设的词数阈值,且不会发生Join以及非连续型数值类型,确定所述索引类型为所述位图索引。

优选地,还包括:

拆分模块,当接收到用户发送的检索表达式时,将所述检索表达式拆分 为多个子表达式;

查询模块,在缓存中查询是否存在与各所述子表达式对应的检索结果;

处理模块,在存在与所述子表达式对应的检索结果时根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应,以及在不存在与所述子表达式对应的检索结果时利用所述列的索引对所述子表达式进行检索,并在根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应之后将检索结果存储与所述缓存。

优选地,还包括:

初始化模块,当所述数据库初始化完成后,按照默认的索引类型为所述数据库中的各个列构建索引,并在达到预设的时刻重新为各所述列构建索引。

由此可见,通过应用本申请的技术方案,首先根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为该列建立索引,并在确定需要为其建立索引时根据该列的数据信息确定索引类型,以及按照索引类型为该列建立索引。从而实现了数据库各列的动态索引建立,并且能够根据实际情况选择合适的索引类型,在减少资源消耗以及人力投入的前提下有效提高数据检索效率。

附图说明

图1为本申请提出的一种索引建立方法的流程示意图;

图2为本申请具体实施例中的一种数据结构示意图;

图3为本申请具体实施例提出的一种流式结果归并流程示意图;

图4为本申请具体实施例提出的一种索引结构示意图;

图5为本申请具体实施例提出的一种索引建立流程示意图;

图6为本申请提出的一种索引建立设备的结构示意图。

具体实施方式

有鉴于背景技术中的问题,本申请提出了一种索引建立方法。通过针对数据库中各个列的索引使用情况及时判断是否需要为其建立索引,以及在建立索引时结合该列的数据信息选择合适的索引类型。从而在节省硬件资源以及人力投入的前提下提高检索效率。

如图1所示,为本申请提出的一种索引建立方法的流程示意图,包括以下步骤:

S101,根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引。

若确定需要为所述列建立索引,执行步骤S102;

若确定不需要为所述列建立索引,则返回步骤S101,继续在下一个预设的时间阈值所对应的时间区间内,确定是否需要为所述列建立索引。

在面对海量数据的情况下,针对数据库中的每一列都建立与其对应的索引是耗时耗力且不必要的,因为不是所有的列都会时常被用户检索或查询。因此本申请针对数据库中的每个列都引入了索引状态信息,并基于一段时间内的索引状态信息确定是否需要为该列建立索引。同时为了保证各个列的索引状态信息能够及时地根据用户的检索方式以及习惯进行调整,本申请每个时间阈值后针对各个列的索引状态信息进行更新以及判断,例如该时间阈值内该列是否使用过索引,以及使用索引是否达到一定的次数。在具体的应用场景中,该时间阈值具体为一个预设的时间区间值,表征统计相应的列的索引使用情况的统计时间范围,可根据数据库的容量以及使用用户的数量进行调整,一般情况下可设置为一天,在此基础上技术人员可以将其延长或是缩短,这些都属于本申请的保护范围。

在本申请的优选实施例中,针对该步骤提出了具体的判断方式,包括如下步骤:

步骤a)获取所述列在所述时间阈值内的所述索引状态信息。

步骤b)根据所述索引状态信息判断所述列在所述时间阈值内是否使用索引,并在判断结果为是时判断所述列在所述时间阈值内使用索引的次数是否不小于预设的次数阈值。

基于上述判断步骤,若所述列在所述时间阈值内未使用索引或所述列在在所述时间阈值内使用索引的次数小于所述次数阈值,确认无需为所述列建立索引;若所述列在在所述时间阈值内使用索引的次数不小于所述次数阈值,确定需要为所述列建立索引。

需要说明的是,尽管以上实施例以特定的步骤以及判断依据实现了是否需要为列建立索引的判断,然而本领域技术人员可以在此基础上采用其他类型的依据进行判断,这些改进都属于本申请的保护范围。

另外,当数据库初始化完毕时,此时数据库中的列都是没有建立索引的,此时本申请将按照默认的索引类型为所述数据库中的各个列构建索引,并在达到预设的时刻重新为各所述列构建索引,在该过程中所统一建立的索引可以由技术人员预先设置。

S102,根据所述列的数据信息确定索引类型,并按照所述索引类型为所述列建立索引。

在通过S101确定该列需要建立索引后,即可根据该列的数据信息确定索引类型,从而能够基于不同的情况为用户提供个性化的检索服务,大大地减少所有用户在查询当前数据库过程中所平均花费的时间。

相反地,如步骤S101中的说明,在确定无需为所述列建立索引的情况下,本申请的技术方案也将在当前的时间阈值所对应的时间区间结束后,重新根据所述列在下一个时间阈值所对应的时间区间内的索引使用状况信息确定是否需要为所述列建立索引,即重新执行步骤S101,从而能够根据实际情况灵活进行调整。

由于目前使用较多的索引类型包括倒排(Invert)索引、B-Tree索引、Hash索引、Bitmap索引,因此在本申请的优选实施例中,具体通过以下条件确定索引类型,:

(1)若所述列为连续型数值类型,确定所述索引类型为所述B-Tree索引。

(2)若所述列会发生Join,确定所述索引类型为所述Hash索引。

需要说明的是,Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join包括:内联接、外联接和交叉联接等。如果需要在两个或以上的表中,获取一个表中的行与另一个表中的行相匹配的数据,则需要考虑使用Join操作,因为Join具有联接表或函数进行查询的特性。

(3)若所述列的词数大于预设的词数阈值,确定所述索引类型为倒排索引。

其中,所述列的词数具体为该列所包含的变量值的数量。

(4)若所述列词数不大于预设的词数阈值,且不会发生Join以及非连续型数值类型,确定所述索引类型为所述位图索引。

在本申请的具体实施例中,如果某一列数据是数值类型并且是连续型(例如金额),那么这种数值类型的字段一般只需要进行范围查询,而如图2所示的数据结构图,B-Tree这种数据结构中间节点天生具备范围属性,所以在面对连续型数值类型的列时,B-Tree索引的范围查找效率远高于倒排索引和位图索引。

此外,假设整个索引片中有n条记录,字段A有x个不同的term值,"delta+vint"原始压缩算法的压缩比为p,那么通过“x*n/32<n*4*p”的变换等式“x<128*p”以及“"delta+vint"压缩算法的最大压缩比为1/4”可以得到如下结果:

当p=1/4时,代入“x<128*p”可以得到x<128*1/4=32。

基于上述结果可以看出,只要词数小于32使用位图索引就比倒排索引节省空间,因此在上述优选实施例中词数阈值可具体设置为32。但同样需要指出的是,该词数阈值可以在后续基于其他的算法进行修改,这并不影响本申请的保护范围。

此外,现有技术中在执行完一次用户的查询之后,并不会保存与之相关的任何结果信息,而通常情况下用户的查询表达式一般都是由多个不同的子表达式所组成的,因此在传统数据库没有原子表达式缓存的情况下,有相同表达式的不同SQL无法复用子表达式的查询结果,从而导致了没有原子表达式缓存导致OLAP(Online Analytical Processing,联机分析处理)任意维度布尔运算性能差。为此本申请优选实施例提出了一种解决方案,在当接收到用户发送的检索表达式时,将所述检索表达式拆分为多个子表达式,并在缓存中查询是否存在与各所述子表达式对应的检索结果,基于以下情况处理:

(1)若存在与所述子表达式对应的检索结果,根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应;

(2)若不存在与所述子表达式对应的检索结果,利用所述列的索引对所述子表达式进行检索,并在根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应之后,将检索结果存储于所述缓存。

以图3所示的流式结果归并流程示意图为例,查询索引解压出来的倒排链在内存是以bitmap(位图)结构存放的。这套流式归并框架就是在不产生任何中间对象的前提下将各个表达式之间的布尔运算一条一条归并出来。整个流式归并过程包括以下4部分:

(1)QueryBuilder(队列创建组件)根据where表达式生成EngineQuery(队列引擎)对象树。

(2)根据EngineQuery对象树构造RowidElector(列标识选举)选举树。

(3)从不同索引拿到RowidSet(列标识集合)挂在叶子节点上,中间节点是逻辑运算合并器。

(4)从根节点一条一条选举,并收集Rowid(列标识)。

该具体实施例是基于不同的SQL语句可能有相同的where子表达式的情况,因此通过将原子表达式进行缓存来加快索引的查询性能。

通过应用以上技术方案,基于列级别独立的索引结构,根据成本和代价自动选择最合适的索引类型,并利用历史统计(HBO)自动调整索引类型,同时进程原子表达式的缓存,从而在节省存储成本的同时加快了索引的查询性能。

为了进一步阐述本发明的技术思想,现结合图4所示的索引结构图对本发明的技术方案进行说明。该具体实施例基于倒排索引、位图索引、Hash索引、B-Tree索引等索引的原理、特性,自主实现了图4所示的列级别的索引架构,可同时支持4中索引类型。索引类型对用户透明,不需要用户外部指定,而是根据数据特征自动选择索引类型。同时多种索引类型采用同一套数据结构做布尔运算,对于引擎层可以不用感知where子表达式的结果从什么索引查出来的。另外,索引可根据历史统计信息自动优化,无需人工参与。

具体地,该索引结构图主要包含以下3部分:

(1)流式结果归并器(Streamed Merger):负责统一不同索引查询结果和计算层之间的交互。不同的索引查询出来的结果均以bitmap进行存储,然后根据where表达式的布尔运算生成流式归并树,再通过归并器逐条输出满足where条件的行号。

(2)索引管理器(Index Manager):负责管理索引,选择类型及自动优化索引流程。

(3)子表达式缓存(BitmapCache):负责缓存where子表达式,这样不 同SQL有相同子表达式不再需要查询索引,可以直接在cache(缓存)中进行查询。

基于上述说明,在图5所示的索引建立流程示意图中,首先针对数据库中的每一列建立索引,并且每天都会重新建立索引并获取历史SQL统计数据,并基于该历史数据针对该列在当天是否使用索引以及使用索引的次数是否超过阈值进行判断。在确定需要为该列建立索引后,根据该列的数据的类型选择不同的索引类型。从而不仅能够支持不同列字段采用不同索引类型(同时支持倒排索引、B-Tree索引、Bitmap索引和Hash索引),而且索引类型的选择可以做到对用户无感知,大大节省存储成本以及提高查询速度。

为达到以上技术目的,本申请还提出了一种索引建立设备,如图6所示,包括:

确定模块610,根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为所述列建立索引;

建立模块620,在所述确定模块确定需要为所述列建立索引时根据所述列的数据信息确定索引类型,并按照所述索引类型为所述列建立索引。

在具体的应用场景中,所述建立模块,还在所述确定模块确定无需为所述列建立索引时,在所述时间阈值后根据所述列在所述时间阈值内的索引使用状况信息确定是否需要为所述列建立索引。

在具体的应用场景中,所述确定模块具体用于:

获取所述列在所述时间阈值内的所述索引状态信息;

根据所述索引状态信息判断所述列在所述时间阈值内是否使用索引,并在判断结果为是时判断所述列在所述时间阈值内使用索引的次数是否不小于预设的次数阈值;

若所述列在所述时间阈值内未使用索引或所述列在在所述时间阈值内使 用索引的次数小于所述次数阈值,确认无需为所述列建立索引;

若所述列在在所述时间阈值内使用索引的次数不小于所述次数阈值,确定需要为所述列建立索引。

在具体的应用场景中,所述索引类型至少包括B-Tree索引、Hash索引、Bitmap索引,所述建立模块根据所述列的数据信息确定索引类型,具体为:

若所述列为连续型数值类型,确定所述索引类型为所述B-Tree索引;

若所述列会发生Join,确定所述索引类型为所述Hash索引;

若所述列的词数大于预设的词数阈值,确定所述索引类型为倒排索引;

若所述列词数不大于预设的词数阈值,且不会发生Join以及非连续型数值类型,确定所述索引类型为所述位图索引。

在具体的应用场景中,还包括:

拆分模块,当接收到用户发送的检索表达式时,将所述检索表达式拆分为多个子表达式;

查询模块,在缓存中查询是否存在与各所述子表达式对应的检索结果;

处理模块,在存在与所述子表达式对应的检索结果时根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应,以及在不存在与所述子表达式对应的检索结果时利用所述列的索引对所述子表达式进行检索,并在根据所述检索结果以及其他子表达式的检索结果生成用于向所述用户返回的检索响应之后将检索结果存储与所述缓存。

在具体的应用场景中,还包括:

初始化模块,当所述数据库初始化完成后,按照默认的索引类型为所述数据库中的各个列构建索引,并在达到预设的时刻重新为各所述列构建索引。

通过应用本申请的技术方案,首先根据数据库中的列在预设的时间阈值内的索引状态信息确定是否需要为该列建立索引,并在确定需要为建立索引 时根据该列的数据信息确定索引类型,以及按照索引类型为该列建立索引。从而实现了数据库各列的动态索引建立,并且能够根据实际情况选择合适的索引类型,在减少资源消耗以及人力投入的前提下有效提高数据检索效率。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施场景所述的方法。

本领域技术人员可以理解附图只是一个优选实施场景的示意图,附图中的模块或流程并不一定是实施本发明所必须的。

本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。

上述本发明序号仅仅为了描述,不代表实施场景的优劣。

以上公开的仅为本发明的几个具体实施场景,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1