CN113553339B - 数据查询方法、中间件、电子装置和存储介质 - Google Patents

数据查询方法、中间件、电子装置和存储介质 Download PDF

Info

Publication number
CN113553339B
CN113553339B CN202110791942.6A CN202110791942A CN113553339B CN 113553339 B CN113553339 B CN 113553339B CN 202110791942 A CN202110791942 A CN 202110791942A CN 113553339 B CN113553339 B CN 113553339B
Authority
CN
China
Prior art keywords
sql statement
query
preset
detection
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110791942.6A
Other languages
English (en)
Other versions
CN113553339A (zh
Inventor
赵峥
范渊
黄进
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
DBAPPSecurity Co Ltd
Original Assignee
DBAPPSecurity Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by DBAPPSecurity Co Ltd filed Critical DBAPPSecurity Co Ltd
Priority to CN202110791942.6A priority Critical patent/CN113553339B/zh
Publication of CN113553339A publication Critical patent/CN113553339A/zh
Application granted granted Critical
Publication of CN113553339B publication Critical patent/CN113553339B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages

Abstract

本申请涉及一种数据查询方法、中间件、电子装置和存储介质,其中,该数据查询方法包括:获取原始sql语句;根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;根据所述目标sql语句进行数据查询,得到查询结果。通过本申请,解决了数据查询效率较低的问题,实现了对原始sql语句本身进行优化,进而提高数据查询效率的技术效果。

Description

数据查询方法、中间件、电子装置和存储介质
技术领域
本申请涉及数据库技术领域,特别是涉及数据查询方法、中间件、电子装置和存储介质。
背景技术
随着信息技术的不断发展,数据呈现爆炸式增长的趋势,并产生了大量需要存储和查询的数据,由于持久层框架MyBatis的sql模板技术愈发成熟,研发人员只需要编写极为简单的sql语句即可满足小数据量的业务需求,但随着数据量增长,基于简单的sql语句对海量的数据进行操作,效率就极为低下。
现有的数据库查询优化方法,是对数据库中存储的数据进行处理,例如,针对sql查询的语句与对应的结构集进行热点数据缓存处理,通过直接调用缓存的sql查询结果来提高查询效率。又或者对数据库采用分布式部署方式,通过轮询模式或权重模式,把接收到的sql查询请求分发到多个数据库,以减少单数据库的查询压力,提高查询效率。然而,上述方法都是通过对数据库进行处理,涉及到的数据量较为庞大,并且需要特定的数据库部署方式,也并没有对进行查询的sql语句本身进行优化,因此,现有的数据查询方法仍存在进一步的优化空间。
针对相关技术中存在数据查询效率较低的问题,目前还没有提出有效的解决方案。
发明内容
在本实施例中提供了一种数据查询方法、中间件、电子装置和存储介质,以解决相关技术中数据查询效率较低的问题。
第一个方面,在本实施例中提供了一种数据查询方法,包括:
获取原始sql语句;
根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;
根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;
根据所述目标sql语句进行数据查询,得到查询结果。
在其中的一个实施例中,所述根据预设检测条件对所述原始sql语句进行检测包括:通过异步调用方法依次对所述原始sql语句进行内容限定使用检测、子查询使用检测和索引查询使用检测。
在其中的一个实施例中,所述根据预设检测条件对所述原始sql语句进行检测,得到检测结果包括:对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据,所述解析数据至少包括:待查询内容字段和待查询表格名称;获取预设检测标识和数据库执行计划,所述预设检测标识至少包括限定查询标识和子查询标识;通过正则匹配检测所述解析数据是否包括全部所述预设检测标识,和/或,通过数据库执行计划对所述原始sql语句进行索引查询使用检测,得到所述检测结果。
在其中的一个实施例中,所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句包括:获取预设优化标识,所述预设优化标识与所述预设检测标识相对应;将所述解析数据与所述预设优化标识进行拼接,得到目标sql语句。
在其中的一个实施例中,所述对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据之后还包括:根据所述解析数据生成数据处理记录,所述数据处理记录包括解析数据、数据调用次数和时间戳。
在其中的一个实施例中,所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标语句还包括:若所述检测结果为所述原始sql语句未使用索引查询,则根据所述解析数据的字段名按照预设顺序进行重排序,得到目标sql语句。
在其中的一个实施例中,根据所述解析数据的字段名按照预设顺序进行重排序之前还包括:获取所述解析数据对应的数据调用次数;若所述数据调用次数大于或者等于调用阈值,则对所述解析数据进行重排序。
第二个方面,在本实施例中提供了一种数据查询中间件,包括:
获取模块,用于获取原始sql语句;
检测模块,用于根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;
优化模块,用于根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;
查询模块,用于根据所述目标sql语句进行数据查询,得到查询结果。
第三个方面,在本实施例中提供了一种电子装置,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述第一个方面所述的数据查询方法。
第四个方面,在本实施例中提供了一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一个方面所述的数据查询方法。
与相关技术相比,在本实施例中提供的数据查询方法,通过获取原始sql语句;根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;根据所述目标sql语句进行数据查询,得到查询结果,解决了数据查询效率较低的问题,实现了对原始sql语句本身进行优化,进而提高数据查询效率的技术效果。
本申请的一个或多个实施例的细节在以下附图和描述中提出,以使本申请的其他特征、目的和优点更加简明易懂。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是本实施例的数据查询方法的终端的硬件结构框图;
图2是本实施例的数据查询方法的流程图;
图3是本实施例的数据查询中间件的结构框图。
具体实施方式
为更清楚地理解本申请的目的、技术方案和优点,下面结合附图和实施例,对本申请进行了描述和说明。
除另作定义外,本申请所涉及的技术术语或者科学术语应具有本申请所属技术领域具备一般技能的人所理解的一般含义。在本申请中的“一”、“一个”、“一种”、“该”、“这些”等类似的词并不表示数量上的限制,它们可以是单数或者复数。在本申请中所涉及的术语“包括”、“包含”、“具有”及其任何变体,其目的是涵盖不排他的包含;例如,包含一系列步骤或模块(单元)的过程、方法和系统、产品或设备并未限定于列出的步骤或模块(单元),而可包括未列出的步骤或模块(单元),或者可包括这些过程、方法、产品或设备固有的其他步骤或模块(单元)。在本申请中所涉及的“连接”、“相连”、“耦接”等类似的词语并不限定于物理的或机械连接,而可以包括电气连接,无论是直接连接还是间接连接。在本申请中所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。通常情况下,字符“/”表示前后关联的对象是一种“或”的关系。在本申请中所涉及的术语“第一”、“第二”、“第三”等,只是对相似对象进行区分,并不代表针对对象的特定排序。
在本实施例中提供的方法实施例可以在终端、计算机或者类似的运算装置中执行。比如在终端上运行,图1是本实施例的数据查询方法的终端的硬件结构框图。如图1所示,终端可以包括一个或多个(图1中仅示出一个)处理器102和用于存储数据的存储器104,其中,处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置。上述终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述终端的结构造成限制。例如,终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示出的不同配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如在本实施例中的数据查询方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输设备106用于经由一个网络接收或者发送数据。上述的网络包括终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(NetworkInterface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
结构化查询语言,Structured Query language,简称sql,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。sql语句的执行效率,会直接影响到用户操作的响应速度。如果sql语句的执行效率较低,会导致应用对用户的操作响应慢,进而影响用户的体验感。可见,sql语句设计的是否合理,直接决定着整个应用的性能。
在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合规定条件的记录返回为止。为了提高sql的查询效率,应当尽量避免全局扫描。但在实际业务处理过程中,sql语句编写人员水平的存在差异,有些sql语句由于语句编写的原因依旧采用全局扫描的方式进行查询,导致sql语句的查询效率低下。
在本实施例中提供了一种数据查询方法,图2是本实施例的数据查询方法的流程图,如图2所示,该流程包括如下步骤:
步骤S201,获取原始sql语句。
具体的,通过TCP模块,获取应用服务器发起的sql查询请求,得到原始sql语句。TCP是一组Internet协议,从上到下分别为:应用程序、传输层、网络层和物理链路层。对于使用TCP协议的程序,数据从应用程序流过TCP模块。TCP模块即可得到原始sql语句。
步骤S202,根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种。
具体的,检测原始sql语句是否使用了限定查询、子查询以及索引查询。限定查询是在基本查询的基础上增加了限定条件,可以对数据进行过滤筛选。
要实现限定查询,一般会应用一些限定查询的符号,包括:关系运算符、逻辑运算符、范围运算符、谓词运算符、空判断以及模糊查询等。其中,关系运算符一般包括>、<、>=、<=、<>以及!=等;逻辑运算符一般包括AND、OR以及NOT;范围运算符一般包括BETWEEN...AND...等;谓词运算符一般包括IN和NOT IN等;空判断一般包括IS NULL和ISNOT NULL等;模糊查询包括LIKE等。通过检测原始sql语句中的关于限定查询的符号,即可检测原始sql语句是否使用了限定查询。
子查询一般包括7种类型,包括where型子查询、from子查询、in子查询、exixts子查询、any子查询、all子查询以及比较运算符子查询。其中,where型子查询是指把内部查询的结构作为外层查询的比较条件。from子查询是指把内层的查询结果当成临时表,供sql再次查询。in子查询指内层查询语句仅返回一个数据列,这个数据列的值将供外层查询语句进行比较。exixts子查询指把外层的查询结果发送至内层,在内层进行判断,若内层返回的结果成立,外层语句才会执行,否则不执行。any子查询指只要满足内层子查询中任意一个比较条件,就返回一个结果作为外层查询条件。all子查询指内层子查询返回的结构需同时满足所有内层查询条件。比较运算符子查询指子查询中可以使用比较运算符。通过对上述子查询条件进行检测,即可判断原始sql语句是否使用了子查询。
索引是建立在表格上的可选对象,目的是为了提高查询速度。如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的ROWID快速找到表中对应的记录。Explain是数据库的一种常用命令,通过explain可以查看sql语句的执行计划。查看该sql语句是否使用了索引,是否做全表扫描等都可以通过explain命令来查看。Explain检测sql输出的信息有10列,分别是:id、select_type、table、type、possible_keys、key、key_len、ref、rows和Extra。其中,id表示选择标识符;select_type表示查询的类型;table标识输出结果集的表;type表示表的连接类型;possible_keys表示查询时,可能使用的索引;key表示实际使用的索引;key_len表示索引字段的长度;ref表示列与索引的比较、rows表示扫描出的行数;Extra表示执行情况的描述和说明。借助数据库的explain<sql>特性分析可以检测sql语句是否使用了索引查询。
步骤S203,根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应。
具体的,根据检测结果,若原始sql语句未使用限定查询、子查询以及索引查询,则根据预设优化规则对原始sql语句进行优化,生成包括限定查询、子查询以及索引查询的目标sql语句。该预设优化规则包括向原始sql语句中插入与限定查询相关的运算符,该运算符包括关系运算符、逻辑运算符、范围运算符、谓词运算符、空判断以及模糊查询,使得经过优化得到的目标sql语句使用限定查询策略。该预设优化规则还包括向原始sql语句中插入where条件,使得经过优化得到的目标sql语句使用子查询策略。该预设优化规则还包括在原始sql语句中使用where重排序优化策略,根据重排序后的where条件创建与原始sql语句对应的复合索引,得到目标sql语句,使得经过优化得到的目标sql语句使用索引查询策略,以避免全表扫描。
步骤S204,根据所述目标sql语句进行数据查询,得到查询结果。
通过上述步骤,本申请的数据查询方法,通过对应用层传来的原始sql语句进行分析,检测原始sql语句是否使用了限定查询、子查询以及索引查询,判断当前的原始sql语句是否需要进行优化,若需要优化,则根据原始sql语句的检测结果,生成采用了限定查询、子查询以及索引查询的目标sql语句。与原始sql语句相比,目标sql语句的查询效率更高,可以进一步的提高查询效率。
在其中的一个实施例中,所述根据预设检测条件对所述原始sql语句进行检测包括:通过异步调用方法依次对所述原始sql语句进行内容限定使用检测、子查询使用检测和索引查询使用检测。
具体的,异步调用是指无需等待被调用函数的返回值就让操作继续进行的方法。在本申请中,异步调用是指将用户的请求sql,即原始sql语句复制一份,然后以异步的非阻塞的方式,去进行分析和测试寻找最优解,该过程耗时和sql语句的复杂程度以及对应表数据的数据库量成正比。采用异步赋值不会阻塞用户的正常请求,提高系统响应和运行效率,提高用户体验。
在其中的一个实施例中,所述根据预设检测条件对所述原始sql语句进行检测,得到检测结果包括:对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据,所述解析数据至少包括:待查询内容字段和待查询表格名称;获取预设检测标识和数据库执行计划,所述预设检测标识至少包括限定查询标识和子查询标识;通过正则匹配检测所述解析数据是否包括全部所述预设检测标识,和/或,通过数据库执行计划对所述原始sql语句进行索引查询使用检测,得到所述检测结果。
具体的,对原始sql语句进行解析,得到解析数据。其中,解析数据至少包括需要查询的字段和涉及的表名,即待查询内容字段和查询表格名称。此外,在一些实施例中,解析数据还可以包括使用的where条件的具体的条件名称以及limit限定条件,即子查询标识和限定查询标识。优选的,还可以根据解析数据生成数据解析记录。基于预设检测规则,优先使用正则匹配检测原始sql语句是否包含限定标识。通过正则匹配分析原始sql语句是否包含子查询优化内容。子查询优化内容可以通过子查询标识进行检测。例如,通过检测解析数据中是否包括where条件进行检测,若存在where条件,则判定存在子查询内容,若不存在where条件,则判定不存在子查询内容。
在其中的一个实施例中,所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句包括:获取预设优化标识,所述预设优化标识与所述预设检测标识相对应;将所述解析数据与所述预设优化标识进行拼接,得到目标sql语句。
具体的,若检测出原始sql语句未使用限定查询、子查询或索引查询中的一种或多种,则根据未使用的查询策略进行对应的优化。例如若原始sql语句中不存在限定标识,则将限定标识拼接到数据解析记录中。若原始sql语句不存在子查询,则根据原始sql语句解析出的where条件,或根据预设的where条件,将原始sql语句对应的解析数据按照预设的顺序进行组合,得到优化后的目标sql语句。若原始sql语句未使用索引查询,则对原始sql语句对应的解析数据进行where条件重排序,按照重排序后的where条件创建索引,进行索引查询。
通过对原始sql语句进行限定查询,可以避免因为原始sql语句没有条目限制导致的全表扫描问题。从而避免在面对较大数据量的情况时,全表扫描的查询效率过低以及系统内存的占用过高的问题。通过对原始sql语句添加子查询内容,可以利用子查询来提高查询效率,例如:select*from user limit 10000,100;该sql语句可以解释为,数据库从第一条记录开始扫描,到第10100条,然后抛弃前10000条,返回剩余的100条。利用子查询优化得到的目标sql语句为:select*from user where id>=(select id from user limit10000,1)limit 100;id字段本身为索引,索引在子查询select id from user limit10000,1中,会在索引上查询第10001条的id,然后外层查询利用id>=子查询的id,使用索引查询大于该id的后100条记录。可以提高sql语句的运行效率。通过使用索引查询:可以帮助用户提高查询速度,利用索引的唯一性控制记录的唯一性,并且可以加速表与表之间的连接,还可以降低查询中分组和排序的时间。此外,如果对应的查询数据,本身就是索引字段,在特定的数据库中,例如mysql数据库,可以减少回表查询,提高查询效率。
在其中的一个实施例中,所述对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据之后还包括:根据所述解析数据生成数据处理记录,所述数据处理记录包括解析数据、数据调用次数和时间戳。具体的,通过生成数据处理记录,可以记录该sql语句的调用次数。通过统计该调用次数,可以获取该sql语句的使用频率。sql语句的调用次数越高,说明用户该sql语句频率越高,因此该sql语句进行优化的需求越大。针对调用次数较少的sql语句,说明该sql语句的使用程度不高,系统可以根据调用次数判断是否需要对该sql语句进行优化,从而在优化sql语句的同时节约计算资源和内存资源。
在其中的一个实施例中,所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标语句还包括:若所述检测结果为所述原始sql语句未使用索引查询,则根据所述解析数据的字段名按照预设顺序进行重排序,得到目标sql语句。
具体的,业务人员编写的不同sql可能是查询同一种数据,但where的条件的顺序不同。例如:针对sql语句SQL1:Select*from user where name=’xiaoming’and sex=’man’and age>29;以及sql语句SQL2:select*from user where sex=’man’and age>29andname=’xiaoming’,这两个sql语句都是同样的查询条件,但是在数据库的运行中并不会对sql进行判断和分析的,这两个sql语句会认为是不同的查询条件。如果此时索引idx1(name,sex,age),则根据最左前缀原则,查询中使用到最左边的列,那么查询就会使用到索引。如果从索引的第二列开始查询,索引将失效。即第一条因为条件顺序为:name,sex,age,是可以使用索引的,但是第二个由于sex,age,name,sex为索引的第二列,索引失效。通过使用sql的where条件重排序策略。通过不同的组合,可以sql语句优化为使用索引的sql语句,从而提高运行效率。
在其中的一个实施例中,根据所述解析数据的字段名按照预设顺序进行重排序之前还包括:获取所述解析数据对应的数据调用次数;若所述数据调用次数大于或者等于调用阈值,则对所述解析数据进行重排序。
下面通过优选实施例对本实施例进行描述和说明。
步骤S301,系统获取用户的原始sql语句,记为old_sql,将原始sql语句作为key。
步骤S302,系统使用散列表记录原始sql语句对应的数据优化记录,其中,散列表记为sql_use_map,将old_sql作为key,将跳表作为value,跳表中存储有当前时间戳和当前old_sql的调用次数,初始的调用次数为1。
步骤S303,系统以old_sql为key到系统数据库中查询是否存在对应的优化记录,系统数据库记为sys_database,若存在优化记录,则取出对应的优化后的sql,替换原始old_sql发起sql查询请求。
步骤S304,若不存在优化记录,则系统复制old_sql到优化模块,异步调用解析进程、限定查询优化进程、子查询优化进程以及索引查询优化进程,即异步执行步骤S305、步骤S306、步骤S307、步骤S308、步骤S309和步骤S3010。
步骤S305,优化模块better_mod对old_sql进行解析,得到解析数据;其中解析数据包括:具体要查询的内容字段,记为need_column;涉及的table表名、使用的where条件具体的条件名,记为where_key、是否包含limit限定,若检测的值为true则使用了limit限定,若检测的值为false,则未使用limit限定。limit限定记为:lim_use。
步骤S306,查询是否存在数据解析记录。数据解析记录除了包括解析数据之外,还包括old_sql调用次数,记做sql_num,以及当前old_sql的分析优化状态值,0为没有优化,1为正在进行优化,记做analysis_status。例如,数据解析记录为:need_column,table,where_key,lim_use,sql_num,analysis_status=1。如果不存在数据解析记录,则把上述解析数据的sql_num赋值为1,analysis_status赋值为0,然后记录入库。如果存在数据解析记录,则把对应的数据解析记录的sql_num+1,然后更新对应记录,然后判断analysis_status,如果analysis_status为0,既当前系统没有对该old_sql进行优化,继续执行优化过程;如果analysis_status为1,既当前系统对old_sql正在进行优化,当前优化流程结束。分析优化状态值是针对old_sql多次调用情况设置的。例如,用户在极端的时间内发起了两次sql查询,且sql查询语句相同,在第二次sql查询的过程中,第一次sql查询未完成,此时分析状态优化值为1,表明old_sql仍在进行优化,则此时第二次sql查询可以停止优化流程,直至第一次查询的优化过程结束,直接调用优化记录即可。又例如,若分析优化状态值为0,则表明当前old_sql未进行优化,需要进行进一步的优化处理。
步骤S307,优化模块better_mod优先使用正则匹配检测old_sql是否包括限定查询标识limit?,?,如果没有limit查询标识,则根据预设的限定查询标识拼接,避免优化测试中进行全表扫描,如果有limit限定标识,则判断进一步正则匹配分析old_sql是否包含子查询优化内容,例如old_sql为where id>(select id from table where?=?and?=?limit?,1)limit X,则认为存在子查询优化内容。并进行索引查询优化。
步骤S308,若old_sql不存在子查询优化内容,则根据old_sql把步骤S306中存储的数据解析记录取出,根据其中的where_key、need_column、table进行重新组合把sql组合为:select need_column from table where id>(select id from table where where_key limit?,1)limit??的形式,将其作为初始优化sql语句记为:new_better_sql。使用new_better_sql和old_sql作为输入条件,执行下一步骤。
步骤S309,优化模块better_mod借助数据库的explain<sql>特性分析,explain为执行计划。如果输入的new_better_sql不为空,则执行explain,分析old_sql对应的new_better_sql是否使用了索引查询,若没有使用索引,则优化模块better_mod从散列表sql_use_map中获取对应的原始sql语句的执行记录的跳表,然后获取跳表的层数size,得出原始sql语句调用的所有次数,判断是否达到系统优化阈值,该优化阈值可由用户根据实际业务需要进行自定义设定。优选的,初始的优化阈值可以为100。若调用次数大于优化阈值则触发where重排序优化策略,该where重排序优化策略如步骤S3010所述。若小于或等于该优化阈值,则根据当前new_better_sql进行数据查询。需要注意的是,该优化阈值不仅可以用于判定是否采用where重排序优化策略,还可通过将调用次数与优化阈值进行比对,决定是否采用限定查询优化策略以及子查询优化策略,本申请对此不作限定。若explain new_better_sql的结果为使用索引,则系统以old_sql为key,以输入的new_better_sql为value输入到系统数据库sys_database作为数据优化记录并进行查询。
步骤S3010,better_mod根据old_sql把步骤S306存储的数据解析记录取出,根据table,获取对应table的列的字段名,然后根据字段名对where_key进行排序。例如:table的列的顺序为:id,name,sex,class,age,create_time,id_del;则where_key为:name=X,age=18,sex=man,class=six,进行where重排序后的where_key为:name=X,sex=man,class=six,age=18;在另一个实施例中,where_key为:sex=woman,class=seven,namelike'肖%',则where_key排序后为:name like'肖%',sex=woman,class=seven。优选的,按照table的原始数据列名,对old_sql的where_key进行排序,然后把old_sql中的where条件,使用排序后的where_key作为temp_sql,进行explain temp_sql分析,如果没有使用索引,则按照当前的排序后的where_key条件,去数据库创建对应的复合索引。然后把temp_sql作为new_better_sql和原始sql语句old_sql为输入。
通过上述步骤,本申请的数据查询方法,提高了应用sql的查询效率。同时,由于本方法可以自动对sql语句进行优化,降低了研发人员的编码难度。
需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在本实施例中还提供了一种数据查询中间件,该中间件用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。以下所使用的术语“模块”、“单元”、“子单元”等可以实现预定功能的软件和/或硬件的组合。尽管在以下实施例中所描述的中间件较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图3是本实施例的数据查询中间件的结构框图,如图3所示,该中间件包括:
获取模块10,用于获取原始sql语句;
检测模块20,用于根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;
优化模块30,用于根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;
查询模块40,用于根据所述目标sql语句进行数据查询,得到查询结果。
所述检测模块20,还用于通过异步调用方法依次对所述原始sql语句进行内容限定使用检测、子查询使用检测和索引查询使用检测。
所述检测模块20,还用于对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据,所述解析数据至少包括:待查询内容字段和待查询表格名称;获取预设检测标识和数据库执行计划,所述预设检测标识至少包括限定查询标识和子查询标识;通过正则匹配检测所述解析数据是否包括全部所述预设检测标识,和/或,通过数据库执行计划对所述原始sql语句进行索引查询使用检测,得到所述检测结果。
所述优化模块30,还用于获取预设优化标识,所述预设优化标识与所述预设检测标识相对应;将所述解析数据与所述预设优化标识进行拼接,得到目标sql语句。
所述优化模块30,还用于根据所述解析数据生成数据处理记录,所述数据处理记录包括解析数据、数据调用次数和时间戳。
所述优化模块30,还用于若所述检测结果为所述原始sql语句未使用索引查询,则根据所述解析数据的字段名按照预设顺序进行重排序,得到目标sql语句。
所述优化模块30,还用于获取所述解析数据对应的数据调用次数;若所述数据调用次数大于或者等于调用阈值,则对所述解析数据进行重排序。
在其中一个实施例中,所述获取模块10还包括TCP连接适配单元,用于接收应用服务器发起的sql查询功能。
需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
在本实施例中还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,获取原始sql语句。
S2,根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种。
S3,根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应。
S4,根据所述目标sql语句进行数据查询,得到查询结果。
需要说明的是,在本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,在本实施例中不再赘述。
此外,结合上述实施例中提供的数据查询方法,在本实施例中还可以提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种数据查询方法。
应该明白的是,这里描述的具体实施例只是用来解释这个应用,而不是用来对它进行限定。根据本申请提供的实施例,本领域普通技术人员在不进行创造性劳动的情况下得到的所有其它实施例,均属本申请保护范围。
显然,附图只是本申请的一些例子或实施例,对本领域的普通技术人员来说,也可以根据这些附图将本申请适用于其他类似情况,但无需付出创造性劳动。另外,可以理解的是,尽管在此开发过程中所做的工作可能是复杂和漫长的,但是,对于本领域的普通技术人员来说,根据本申请披露的技术内容进行的某些设计、制造或生产等更改仅是常规的技术手段,不应被视为本申请公开的内容不足。
“实施例”一词在本申请中指的是结合实施例描述的具体特征、结构或特性可以包括在本申请的至少一个实施例中。该短语出现在说明书中的各个位置并不一定意味着相同的实施例,也不意味着与其它实施例相互排斥而具有独立性或可供选择。本领域的普通技术人员能够清楚或隐含地理解的是,本申请中描述的实施例在没有冲突的情况下,可以与其它实施例结合。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对专利保护范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

Claims (7)

1.一种数据查询方法,其特征在于,包括:
获取原始sql语句;
根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;
所述根据预设检测条件对所述原始sql语句进行检测,得到检测结果包括:
对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据,所述解析数据至少包括:待查询内容字段和待查询表格名称;
获取预设检测标识和数据库执行计划,所述预设检测标识至少包括限定查询标识和子查询标识;
通过正则匹配检测所述解析数据是否包括全部所述预设检测标识,和/或,通过数据库执行计划对所述原始sql语句进行索引查询使用检测,得到所述检测结果;
所述对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据之后还包括:
根据所述解析数据生成数据处理记录,所述数据处理记录包括解析数据、数据调用次数和时间戳;
根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;
所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句还包括:
若所述检测结果为所述原始sql语句未使用索引查询,则根据所述解析数据的字段名按照预设顺序进行重排序,得到目标sql语句;
根据所述目标sql语句进行数据查询,得到查询结果。
2.根据权利要求1所述的数据查询方法,其特征在于,所述根据预设检测条件对所述原始sql语句进行检测包括:
通过异步调用方法依次对所述原始sql语句进行内容限定使用检测、子查询使用检测和索引查询使用检测。
3.根据权利要求1所述的数据查询方法,其特征在于,所述根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句包括:
获取预设优化标识,所述预设优化标识与所述预设检测标识相对应;
将所述解析数据与所述预设优化标识进行拼接,得到目标sql语句。
4.根据权利要求1所述的数据查询方法,其特征在于,根据所述解析数据的字段名按照预设顺序进行重排序之前还包括:
获取所述解析数据对应的数据调用次数;
若所述数据调用次数大于或者等于调用阈值,则对所述解析数据进行重排序。
5.一种数据查询中间件,其特征在于,包括:
获取模块,用于获取原始sql语句;
检测模块,用于根据预设检测条件对所述原始sql语句进行检测,得到检测结果,所述预设检测条件包括限定查询使用检测、子查询使用检测和索引查询使用检测中的一种或多种;
检测模块,还用于对所述原始sql语句进行解析,得到所述原始sql语句对应的解析数据,所述解析数据至少包括:待查询内容字段和待查询表格名称;
获取预设检测标识和数据库执行计划,所述预设检测标识至少包括限定查询标识和子查询标识;
通过正则匹配检测所述解析数据是否包括全部所述预设检测标识,和/或,通过数据库执行计划对所述原始sql语句进行索引查询使用检测,得到所述检测结果;
优化模块,用于根据所述检测结果获取预设优化规则,并基于所述预设优化规则和所述原始sql语句生成目标sql语句,所述预设优化规则与所述预设检测条件相适应;
优化模块,还用于根据所述解析数据生成数据处理记录,所述数据处理记录包括解析数据、数据调用次数和时间戳;
优化模块,还用于若所述检测结果为所述原始sql语句未使用索引查询,则根据所述解析数据的字段名按照预设顺序进行重排序,得到目标sql语句;
查询模块,用于根据所述目标sql语句进行数据查询,得到查询结果。
6.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1至4中任一项所述的数据查询方法。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至4中任一项所述的数据查询方法的步骤。
CN202110791942.6A 2021-07-13 2021-07-13 数据查询方法、中间件、电子装置和存储介质 Active CN113553339B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110791942.6A CN113553339B (zh) 2021-07-13 2021-07-13 数据查询方法、中间件、电子装置和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110791942.6A CN113553339B (zh) 2021-07-13 2021-07-13 数据查询方法、中间件、电子装置和存储介质

Publications (2)

Publication Number Publication Date
CN113553339A CN113553339A (zh) 2021-10-26
CN113553339B true CN113553339B (zh) 2024-03-19

Family

ID=78131781

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110791942.6A Active CN113553339B (zh) 2021-07-13 2021-07-13 数据查询方法、中间件、电子装置和存储介质

Country Status (1)

Country Link
CN (1) CN113553339B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114490724B (zh) * 2022-04-15 2022-06-14 北京奥星贝斯科技有限公司 处理数据库查询语句的方法和装置
CN115114325B (zh) * 2022-06-24 2023-04-18 腾讯科技(深圳)有限公司 数据查询方法、装置、电子设备以及存储介质
CN115544064A (zh) * 2022-11-24 2022-12-30 中国电子信息产业集团有限公司 一种基于自定义优化规则的数据优化方法及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103365909A (zh) * 2012-04-09 2013-10-23 江南大学 一种数据表中依次逐一生成累加值的方法
CN112347120A (zh) * 2020-10-27 2021-02-09 蜂助手股份有限公司 一种基于复杂sql的自动优化方法和装置
CN112559554A (zh) * 2020-12-24 2021-03-26 北京百家科技集团有限公司 一种查询语句优化方法及装置
CN112597182A (zh) * 2020-12-16 2021-04-02 平安普惠企业管理有限公司 数据查询语句的优化方法、装置、终端及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101093493B (zh) * 2006-06-23 2011-08-31 国际商业机器公司 数据库查询语言转换方法、转换装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103365909A (zh) * 2012-04-09 2013-10-23 江南大学 一种数据表中依次逐一生成累加值的方法
CN112347120A (zh) * 2020-10-27 2021-02-09 蜂助手股份有限公司 一种基于复杂sql的自动优化方法和装置
CN112597182A (zh) * 2020-12-16 2021-04-02 平安普惠企业管理有限公司 数据查询语句的优化方法、装置、终端及存储介质
CN112559554A (zh) * 2020-12-24 2021-03-26 北京百家科技集团有限公司 一种查询语句优化方法及装置

Also Published As

Publication number Publication date
CN113553339A (zh) 2021-10-26

Similar Documents

Publication Publication Date Title
CN113553339B (zh) 数据查询方法、中间件、电子装置和存储介质
US9870390B2 (en) Selecting from OR-expansion states of a query
EP3702932A1 (en) Method, apparatus, device and medium for storing and querying data
EP2637111A1 (en) Data management system and method using database middleware
CN107783985B (zh) 一种分布式数据库查询方法、装置及管理系统
US10146818B2 (en) Computing system
CN112800287B (zh) 基于图数据库的全文索引方法和系统
CN111221840B (zh) 数据处理方法及装置、数据缓存方法、存储介质、系统
US8812492B2 (en) Automatic and dynamic design of cache groups
US11308060B2 (en) Method, apparatus, device and storage medium for managing index
CN109947770A (zh) 一种数据库查询方法、终端设备及存储介质
CN109299101B (zh) 数据检索方法、装置、服务器和存储介质
US11386131B2 (en) System and method for multi-language search
EP3173947A1 (en) Paged inverted index
CN111966843A (zh) 图数据库构建方法、路径搜索方法、装置和电子设备
CN113946600A (zh) 数据查询方法、装置、计算机设备和介质
CN110874365B (zh) 一种信息查询方法及其相关设备
CN116467310A (zh) 无效索引的无锁标记方法、存储介质和计算机设备
CN115357606A (zh) 数据源查询方法、系统、计算机设备和存储介质
CN116204546A (zh) Sql预编译方法、装置、服务器和存储介质
CN112269784A (zh) 一种基于硬件实现的哈希表结构以及插入、查询和删除方法
US11741097B2 (en) Tree structure data processing system, tree structure data processing method, tree structure data processing device, and tree structure data processing program
CN112765174B (zh) 基于哈希连接的探测方法、装置、设备及存储介质
CN117573690A (zh) 数据检索方法、装置、计算机设备和存储介质
KR100535839B1 (ko) 대표번호 검색방법

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant