一种关系数据库的高效查询方法和装置与流程

文档序号:29355772发布日期:2022-03-22 23:55阅读:158来源:国知局
一种关系数据库的高效查询方法和装置与流程

1.本发明涉及数据库技术领域,具体涉及一种关系数据库的高效查询方法和装置。


背景技术:

2.数据库的应用领域非常广泛,不管是家庭、公司或大型企业,还是政府部门,都需要使用数据库来存储数据信息。其中,应用最多的是关系型数据库,如oracle、mysql、sqlserver等。
3.关系型数据库基于单一关系模型,结构化存储,有完整性约束,和常见的表格比较相似,通过二维表建立数据之间的联系,采用结构化查询语言(sql)做数据读写。其优点在于,通过事务处理保持数据的一致性,数据更新的开销很小,可以进行join等复杂查询。然而,关系型数据库使用select语句对二维表进行查询,如果直接对关系型数据库进行查询,会对数据库造成较大压力,查询效率较低。
4.有鉴于此,急需对现有的关系型数据库查询方法进行改进,以减轻查询关系型数据库的压力,提升查询效率。


技术实现要素:

5.针对上述缺陷,本发明所要解决的技术问题在于提供一种关系数据库的高效查询方法和装置,以解决现有的关系型数据库查询方法,对数据库造成较大压力,查询效率较低的问题。
6.为此,本发明提供的一种关系数据库的高效查询方法,包括以下步骤:
7.将查询关系数据库获得的记录写入第一二维表并将所述第一二维表写入redis生成第二二维表,所述第二二维表作为所述第一二维表的缓存,所述关系数据库上保存有第一二维表生成或更新时的第一时间戳;所述第二二维表中保存有所述第二二维表生成或更新时的第二时间戳;根据所述第一时间戳更新所述第二时间戳;
8.通过比较所述第一时间戳与所述第二时间戳的时间先后,判断所述二维表是否需要生成或更新,无所述第二时间戳视为所述第一时间戳在后;
9.如果所述第二二维表需要生成或更新,则根据查询条件从关系数据库读取满足查询条件的记录,然后将该记录以及查询索引写入redis生成或更新所述第二二维表;否则,不更新所述第二二维表,从所述第二二维表中查询满足查询条件的记录。
10.在上述方法中,将关系数据库中的记录写入所述第一二维表时,生成所述第一时间戳,并将所述第一时间戳与所述第二二维表的映射关系构造第三二维表,保存在关系数据库中;
11.关系数据库上设有触发器,当所述第一二维表发生插入、更新或删除操作时,更新所述第一时间戳。
12.在上述方法中,优选地,判断是否需要生成或更新所述第二二维表包括以下步骤:
13.从关系数据库读取所述第一二维表的第一时间戳,从redis读取与所述第一二维
表对应的第二二维表的第二时间戳;
14.判断所述第二时间戳是否存在,如果所述第二时间戳不存在,则将所述第一二维表写入redis生成所述第二二维表,并将所述第一时间戳写入所述第二二维表,形成所述第二时间戳;否则比较所述第一时间戳与所述第二时间戳的时间先后,如果所述第一时间戳在后,则根据所述第一二维表更新所述第二二维表及所述第二时间戳;如果所述第一时间戳与所述第二时间戳相同,则不需要更新所述第二二维表。
15.在上述方法中,优选地,将查询关系数据库获得的所述记录以及查询索引写入redis生成或更新所述第二二维表,包括以下内容:
16.第二时间戳,用于标识是否需要更新所述第二二维表;
17.记录总数,用于查询所述第二二维表;
18.列名称;
19.记录内容,其键为所述第二二维表中的记录的下标;
20.查询索引,用于快速定位所述第二二维表中满足指定的列的记录。
21.在上述方法中,优选地,在redis上存储所述第二二维表的列名称时,使用分隔符将所述第二二维表中所有的列名称拼接起来作为一个字符串进行存储;将所述第二二维表中的每行记录的键设置为下标,各个字段的值使用分隔符,将各个字段的值拼接起来作为一个字符串进行存储。
22.在上述方法中,优选地,开始向redis写入第二二维表时,首先使用wathch命令,写入完成后使用exex提交事务。
23.在上述方法中,优选地,查询所述第二二维表的方法如下:先读取所述第二二维表的记录总数,接着取出字段名称,根据所述第二二维表的记录总数,对记录下标进行循环遍历,取出所述第二二维表中的所有记录。
24.在上述方法中,根据列对所述第二二维表进行查询的方法如下:先根据查询条件使用所述第二二维表的查询索引获取记录下标,接着取出字段名称,最后根据记录下标取出指定的记录。
25.本发明还提供了一种关系数据库的高效查询装置,包括:
26.二维表创建模块,用于将查询关系数据库获得的记录写入第一二维表并将所述第一二维表写入redis生成第二二维表,所述第二二维表作为所述第一二维表的缓存;
27.时间戳生成模块,用于在生成所述第一二维表时生成第一时间戳,并将所述第一时间戳与所述第一二维表的映射关系构造第三二维表保存在关系数据库中;将所述第一时间戳写入所述第二二维表,形成所述第二时间戳;
28.时间戳更新模块,用于所述第一二维表发生插入、更新或删除操作时,更新所述第一时间戳;根据所述第一时间戳,更新所述第二时间戳;
29.比较模块,用于比较所述第一时间戳与所述第二时间戳的时间先后,判断所述第二二维表是否需要生成或更新,无所述第二时间戳视为所述第一时间戳在后;
30.第二二维表更新模块,用于根据比较模块得出的所述第二二维表是否需要生成或更新的结果,如果所述第二二维表需要更新,则根据查询条件从关系数据库读取满足查询条件的记录,然后将该记录以及查询索引写入redis更新所述第二二维表;否则,不更新所述第二二维表。
31.在上述装置中,优选地,关系数据库上设有触发器,当所述第一二维表发生插入、更新或删除操作时,通过所述触发器更新所述第一时间戳。
32.由上述技术方案可知,本发明提供的一种关系数据库的高效查询方法和装置,解决了现有关系型数据库查询方法,对数据库造成较大压力,查询效率较低的问题。与现有技术相比,本发明具有以下有益效果:
33.在redis上创建二维表作为关系数据库的缓存,通过比较redis上的二维表的时间戳和关系数据库上的二维表的时间戳的先后,判断是否需要更新redis上的二维表,如果需要,则根据查询条件从读取关系数据库二维表,获取满足查询条件的记录,然后将关系数据库二维表以及查询索引等数据写入redis;否则,直接从redis查询满足指定条件的记录。由于部分记录可以从redis缓存的二维表中查询获得,因此,减轻了关系数据库的压力,提高了查询效率。
附图说明
34.为了更清楚地说明本发明的实施例或现有技术中的技术方案,下面将对本发明实施例或现有技术描述中所需要使用的附图做出简单地介绍和说明。显而易见地,下面描述中的附图仅仅是本发明的部分实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
35.图1为本发明提供的一种关系数据库的高效查询方法流程图;
36.图2为本发明中判断redis上的第二二维表是否需要生成或更新的流程图。
具体实施方式
37.下面将结合本发明实施例附图,对本发明实施例的技术方案进行清楚、完整地描述,显然,以下所描述的实施例,仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动的前提下,所获得的所有其他实施例,都属于本发明保护的范围。
38.本发明的实现原理是:
39.在redis上创建二维表作为oracle的缓存,通过比较redis上的二维表的时间戳和oracle上的二维表的时间戳的先后,从oracle或redis查询满足指定条件的记录。由于部分记录可以从redis缓存的二维表中查询获得,因此,减轻了oracle关系数据库的压力,提高了查询效率。
40.为了对本发明的技术方案和实现方式做出更清楚地解释和说明,以下介绍实现本发明技术方案的几个优选的具体实施例。
41.需要说明的是,本文中“内、外”、“前、后”及“左、右”等方位词是以产品使用状态为基准对象进行的表述,显然,相应方位词的使用对本方案的保护范围并非构成限制。
42.以下描述中,以oracle数据库为例进行说明,可以理解的是,本技术方案并不局限于仅适用于oracle数据库,还可适用于mysql、sqlserver等所有的关系数据库。
43.另外,在以下的描述中,oracle数据库简称为oracle,redis数据库简称为redis。
44.请参见图1,图1为本发明提供的一种关系数据库的高效查询方法流程图。
45.如图1所示,本发明提供的一种关系数据库的高效查询方法,包括以下步骤:
46.步骤110,将查询oracle获得的记录写入第一二维表r1,并将第一二维表r1写入redis生成第二二维表r2,第二二维表r2作为第一二维表r1的缓存,以便后续快速查询。
47.oracle上保存有第一二维表r1生成或更新时的第一时间戳t1,第二二维表r2中保存有第二二维表生成或更新时的第二时间戳t2。
48.具体地,生成第一二维表r1时会同时记录第一二维表r1的生成时间,记为第一时间戳t1。将第一时间戳t1与第一二维表r1的映射关系构造第三二维表保存在oracle中,形成第三二维表,通过查询第三二维表可以获得第一二维表r1的第一时间戳t1(第一二维表r1的最新的修改时间)。
49.同时,将第一二维表r1写redis生成第二二维表r2时,会将第一时间戳t1同时写入第二二维表r2,形成第二时间戳t2。
50.redis上存储有与第一二维表r1对应的第二二维表r2,第二二维表r2作为oracle的缓存,且第二二维表r2中存储每一个第二二维表的第二时间戳t2。
51.redis是一个高性能的key-value数据库,属于键值数据库,性能高,支持通过键来查询,但不支持按照值来查询,不支持二维表按列查询。应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统等。
52.oracle上设有触发器,当第一二维表t1发生插入、更新、删除等操作时,触发器将触发更新第一二维表r1中第一时间戳t1的操作,将第一时间戳t1更新为第一二维表r1的最新修改时间。
53.第二时间戳t2的更新方式可以采用以下两种方式实现。
54.第一种方式是:定时轮询第一时间戳t1,并与第二时间戳t2进行对比,如果二者不同,则用第一时间戳t1更新第二时间戳t2。
55.第二种方式是:每次查询第二二维表r2时,首先获取第二二维表r2中的第二时间戳t2,然后再获取第一二维表r1中的第一时间戳t1,对比第一时间戳t1和第二时间戳t2是否相同,如果二者相同,则不更新第二时间戳t2,如果二者不同,则用第一时间戳t1更新第二时间戳t2。
56.步骤120,当执行oracle查询时,通过比较redis上的第二二维表的第二时间戳t2和oracle上的第一二维表的第一时间戳t1的时间先后,判断是否需要生成或更新redis上的第二二维表,如果需要,则执行步骤130;否则,执行步骤140。
57.具体地,如图2所示,判断是否需要生成或更新redis上的第二二维表t2包括以下步骤:
58.步骤121,从oracle读取第一二维表的第一时间戳t1,从redis读取与第一二维表对应的第二二维表的第二时间戳t2。
59.步骤122,判断第二时间戳t2是否存在,如果第二时间戳t2不存在,说明redis不存在与第一二维表对应的第二二维表,需要更新redis,于是将查询oracle获得的记录以及查询索引写入redis生成第二二维表r2,并将第一时间戳t1写入第二二维表r2,形成第二时间戳t2。
60.如果第二时间戳t2存在,则执行步骤123,比较第一时间戳t1与第二时间戳t2的时间先后,如果第一时间戳t1在后,即第一时间戳t1的时间晚于第二时间戳t2的时间,则说明第一二维表r1是较新的,需要更新redis上的第二二维表,于是根据oracle上的第一二维表
r1更新redis上的第二二维表r2,同时用第一时间戳t1更新第二时间戳t2;如果第一时间戳t1与第二时间戳t2相同,则说明oracle上的第一二维表r1与redis上的第二二维表r2相同,oracle上的第一二维表t1没有更新,不需要更新redis上的第二二维表。
61.步骤130,根据查询条件从oracle读取获得满足查询条件的记录写入第一二维表r1,然后将第一二维表r1以及查询索引等数据写入redis,这样就在redis生成了与第一二维表r1对应的第二二维表r2,本次查询结束。
62.步骤140,直接从redis上的第二二维表r2中查询满足查询条件的记录。
63.在上述方法的步骤130中,根据查询条件从oracle读取获得满足查询条件的记录写入第一二维表的过程如下:
64.使用select语句从oracle读取数据,可以是直接读取整个完整的二维表,或者使用sql查询语句查询满足一定条件的记录,并将读取到的记录写入第一二维表。
65.假设应用程序使用c++语言实现,则可使用vector《map《string,string》》在内存中保存读取到的整个完整的二维表,或者保存使用sql查询语句查询满足一定条件的记录,写入第一二维表。
66.步骤130中,将查询oracle获得的第一二维表以及查询索引写入redis生成或更新第二二维表,包括以下内容:
67.第二时间戳,用于标识是否需要更新第二二维表。第二时间戳使用string对象存储,往redis写入oracle上第一二维表的缓存数据或更新第二二维表时,会将oracle上对应的第一二维表的第一时间戳t1写入redis,作为第二时间戳t2。
68.记录总数,使用string对象存储,用于查询第二二维表;
69.列名称,使用string对象存储,存储第二二维表的列名称时,由于第二二维表可能包含多列,使用“|”作为分隔符,将所有的列名称拼接起来作为一个字符串进行存储。使用“|”作为分隔符,是因为假定列名称中不包含该字符。例如,第二二维表t2包含两列,f1和f2,则在redis存储为t2:fields-》f1|f2。
70.记录内容,其键为第二二维表r2中的记录的下标,使用string对象存储。由于已独立存储第二二维表的列名称,故存储第二二维表记录时,不再需要存储列名称。将每行记录的键设置为下标,各个字段的值使用“|”作为分隔符,将各个字段的值拼接起来作为一个字符串进行存储。应当理解,使用“|”作为分隔符,假定各个字段的值不包含该字符。
71.查询索引,使用hash对象存储,用于快速定位第二二维表中满足指定列的记录。
72.往redis写入第二二维表时,先清除redis中第二二维表的旧数据,清除的数据包括该第二二维表中相关的第二时间戳,记录总数,列名称,记录以及查询索引数据。
73.二维表查询索引用来满足快速定位到指定列值的二维表记录下标。假设需要对二维表t(第一二维表或第二二维表)的列f1进行查询(t可以包含更多的列),二维表在列f1字段的值存在v1,v2,v3,...,当f1的值为v1时的二维表记录的下标有1,4;当f1的值为v2时的二维表记录下标有2,5;当f1的值为v3时的二维表记录下标有3,6,7,则对于f1字段构造的索引为:
74.t:f1:v1-》1|4
75.t:f1:v2-》2|5
76.t:f1:v3-》3|6|7
77.采用string对象来存储记录下标,且下标之间使用“|”分隔。为提高存储效率,使用redis的hash对象来存储以上关系。其中,键为t:f1,字段分别为v1,v2,v3,值分别为1|4,2|5,3|6|7。
78.同理,假设对字段f2构造的索引如下:
79.t:f2:t1-》1|4|7
80.t:f2:t2-》2|3|5|6
81.则构造好查询索引后,既可以单独对列f1或者f2进行查询,也可以同时指定列f1和列f2的条件。
82.例如,需要查询二维表t中满足列f1值为v2,列f2值为t2所有记录。由索引t:f1:v2-》2|5可以知道列f1值为v2的记录下标有2,5,由索引t:f2:t2-》2|3|5|6可以知道列f2的值为t2的记录下标有2,3,5,6,对两个记录下标求交集,得到下标2,5,即记录2和记录5满足查询条件。
83.往redis写入第二二维表的过程涉及多步操作,为避免在写入数据的过程中其他应用程序对该第二二维表数据进行修改,本技术使用了redis的事务机制。
84.开始向redis写入第二二维表记录时,首先使用redis的wathch命令,最后一步则使用redis的exex提交事务。如果在执行wathch命令后,有其他应用程序对该第二二维表数据进行了修改,则事务执行失败,无法往redis写入该第二二维表相关数据,而由其他应用程序写入。
85.往redis写入最新的第二二维表以及相关的查询索引后,就可以进行查询满足指定条件的记录了,步骤140中,从redis查询第二二维表记录的过程如下:
86.查询时,区分是否需要读取整个第二二维表。如果需要查询整个第二二维表,则先读取该第二二维表记录总数,接着取出字段名称,根据第二二维表的记录总数,对记录下标进行循环遍历,取出第二二维表的所有记录。
87.如果需要根据列对第二二维表进行查询,则先根据查询条件使用第二二维表的查询索引获取记录下标,接着取出字段名称,最后根据记录下标取出指定的记录。获取满足指定查询条件的记录下标,可以参考上文有关查询索引的构造与使用。
88.往redis读取第二二维表的过程涉及多步操作,为避免在读取数据的过程中其他应用程序对该第二二维表数据进行修改,本技术同样使用redis的事务机制。读取整个第二二维表数据后,首先执行watch命令,获取记录总数或记录下标后,执行multi命令,执行所有redis查询命令后,执行exec命令。如果读取第二二维表数据过程中,其他应用程序修改了该第二二维表的数据,则读取失败。这时应用程序可以根据实际需要再次读取,或者提示报错。
89.本技术提供的关系数据库的高效查询方法,使用redis存储与查询二维表的缓存,不是简单地根据查询条件来构造redis缓存,而是将整个二维表以及查询条件索引缓存起来,提高了查询命中redis缓存的概率,可以充分利用了redis高性能的特点,将大部分请求落在redis上处理,有利于减轻oracle数据库的压力,并提升查询效率。
90.综合以上具体实施例的描述,本发明提供的一种关系数据库的高效查询方法和装置,与现有技术相比,具有如下优点:
91.第一,在redis上创建二维表作为oracle的缓存,可以从redis缓存的二维表中查
询获得记录,减轻了oracle关系数据库的压力,提高了查询效率。。
92.第二,通过比较redis上的二维表的时间戳和oracle上的二维表的时间戳的先后,判断是否需要更新redis上的二维表,保证数据记录的准确性和一致性。
93.第三,在oracle上的二维表发生插入、更新或删除操作时,使用触发器更新oracle上的第一二维表的第一时间戳,并通过轮询或读取redis上第二二维表时,根据第一时间戳更新第二时间戳,由此进一步保证数据记录的准确性和一致性。
94.第四,使用redis的事务机制,避免读取和写入数据的过程中其他应用程序对二维表数据进行修改。
95.最后,还需要说明的是,在本文中使用的术语"包括"、"包含"或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句"包括一个

"限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
96.本发明并不局限于上述最佳实施方式,任何人应该得知在本发明的启示下做出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1