具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明实施例提供的分布式数据库中的执行计划信息生成方法和系统,具体的,所述方法和系统实现了生成查询语句(以下简称SQL语句)在分布式数据库中数据库中间件(以下简称“DBproxy层”)的执行计划信息(以下简称“explain”),并通过获得SQL语句在数据库节点上的explain和在DBproxy层上的explain,将二者整合在一起,从而实现分布式数据库的explain技术。
具体的,在本发明第一实施例中,提供一种分布式数据库中的执行计划信息生成方法,应用于分布式数据库中的DBproxy层,如图1所示,所述方法包括:
步骤S101,接收到客户端发送的SQL语句,生成所述SQL语句的执行计划树;
本实施例中,接收到SQL语句后,解析该SQL语句,得到SQL语句的语法树,并根据解析得到的语法树生成执行计划树。
步骤S102,按照设定的执行计划信息的输出格式,对所述执行计划树中的执行信息进行封装,生成所述SQL语句在DBproxy层的explain。
在本发明的一个具体实施例中,所述执行计划树中的执行信息包括:执行计划树中各节点的节点信息;所述节点信息包括:本节点的执行顺序、本节点的类型、本节点在执行计划树上的唯一编号、本节点在执行计划树上的位置、本节点的属性信息和本节点待执行的所述SQL语句。
在本发明的一个较佳的实施例中,设定的执行计划信息的输出格式为:MySQL数据库的explain的输出格式。也就是说,本实施例中,基于MySQL数据库的explain技术,实现分布式数据库中DBproxy的explain技术。
此时,按照设定的执行计划信息的输出格式,对所述执行计划树中的执行信息进行封装,包括:
按照所述MySQL数据库的执行计划信息输出列的数量和位置,设计所述执行计划树中各节点的执行计划信息输出列,使得每个节点的执行计划信息输出列中至少包括本节点的执行顺序、本节点的类型、本节点在执行计划树上的唯一编号、本节点在执行计划树上的位置、本节点的属性信息和本节点待执行的所述查询语句。
在本发明的一个具体实施例中,按照所述MySQL数据库的explain的输出列的数量和位置,设计出所述执行计划树中各节点的explain的输出列依次为:seq_id、node_type、node_id、type、sql_info、key、key_len、node_tree、rows和Extra;
定义输出列中seq_id为本节点的执行顺序、node_type为本节点的类型、node_id为本节点在执行计划树上的唯一编号、sql_info为待执行的SQL语句、node_tree为本节点在执行计划树上的位置、Extra为本节点的其他信息、type、key、key_len、rows为空。
在本发明的又一实施例中,在生成所述SQL语句在DBproxy层的explain后,如图2所示,还包括:
步骤S103,判断是否需要将所述SQL语句下发到数据库节点,并在需要时,将所述SQL语句下发到数据库节点,并接收各数据库节点返回的所述SQL语句在对应数据库节点上的explain;
在本发明的一个较佳的实施例中,可以根据所述SQL语句是否带有指定的explain命令选项,来判断是否需要将所述SQL语句下发到数据库节点。具体的,判断所述SQL语句是否带有指定的explain命令选项,若是,判定出需要将所述SQL语句下发到数据库节点;否则,不需要将所述SQL语句下发到数据库节点。当然,本领域技术人员容易想到的其他方式,只要能够辨别是否要将SQL语句下发到数据库层都在本发明的保护思想范围内。
步骤S104,将DBproxy层的explain与各数据库节点返回的explain进行整合,得到分布式数据库的explain。
在本发明的一个具体实施例中,explain的整合方式包括:模拟所述执行计划树的执行流程,按照所述执行计划树中各节点的执行顺序,将各数据库节点返回的explain放置在DBproxy层对应节点的explain下,实现将DBproxy层的explain与各数据库节点返回的explain按照执行顺序整合在一起。
在本发明的又一实施例中,得到分布式数据库的explain后,还包括:按需输出分布式数据库的explain、只输出DBproxy层的explain或者只输出各数据库节点的explain。
具体的,本实施例中,仍然可以通过SQL语句中是否带有指定的explain命令选项,来判断是输出分布式数据库的explain,还是只输出DBproxy层或各数据库节点的explain。
综上可知,本发明实施例所述方法实现分布式数据库的explain获得SQL语句的执行计划,包括SQL语句在DBproxy自身内部的执行计划和SQL语句下发到MySQL数据库的执行计划。既可以单独显示SQL语句在MySQL数据库上的执行计划,又可以单独显示SQL语句在DBproxy上的执行计划,也可以全部显示SQL语句在DBproxy和MySQL数据库上的执行计划信息。所述执行计划信息可以更好的帮助开发人员写出更优化的查询语句,通过优化SQL语句尽可能地将SQL语句下发到数据库上执行,从而充分利用数据库提供的计算和存储能力,避免将数据通过网络传递到DBProxy层上做操作,从而使查询语句的执行效率更高。
在本发明第二实施例中,提供一种分布式数据库中的执行计划信息生成系统,应用于分布式数据库中的DBproxy层,如图3所示,所述系统包括:
执行模块310,用于接收客户端发送的SQL语句;
语句处理模块320,用于生成所述SQL语句的执行计划树,按照设定的执行计划信息的输出格式,对所述执行计划树中的执行信息进行封装,生成所述SQL语句在DBproxy层的explain。
基于上述结构框架及实施原理,下面给出在上述结构下的几个具体及优选实施方式,用以细化和优化本发明所述系统的功能,以使本发明方案的实施更方便,准确。具体涉及如下内容:
在本发明的一个具体实施例中,语句处理模块320具体包括:Select单元、update单元、delete单元和insert单元。
执行模块310接收到SQL语句后,首先分析应由语句处理模块320中的哪个单元处理该SQL语句,并调用处理该SQL语句单元的入口函数,以触发该单元获取SQL语句,并生成SQL语句在DBproxy层的explain。
在本发明的一个具体实施例中,语句处理模块320,具体用于解析所述SQL语句,得到SQL语句的语法树,并根据解析得到的语法树生成执行计划树。
在本发明的又一个具体实施例中,所述执行计划树中的执行信息包括:执行计划树中各节点的节点信息;所述节点信息包括:本节点的执行顺序、本节点的类型、本节点在执行计划树上的唯一编号、本节点在执行计划树上的位置、本节点的属性信息和本节点待执行的所述查询语句。
在本发明的一个较佳实施例中,语句处理模块320,用于按照MySQL数据库的执行计划信息的输出格式,对所述执行计划树中的执行信息进行封装。
具体的,语句处理模块320,按照所述MySQL数据库的执行计划信息输出列的数量和位置,设计所述执行计划树中各节点的执行计划信息输出列,使得每个节点的执行计划信息输出列中至少包括本节点的执行顺序、本节点的类型、本节点在执行计划树上的唯一编号、本节点在执行计划树上的位置、本节点的属性信息和本节点待执行的所述SQL语句。
在一个具体实施例中,语句处理模块320按照所述MySQL数据库的explain的输出列,设计出所述执行计划树中各节点的explain的输出列依次为:seq_id、node_type、node_id、type、sql_info、key、key_len、node_tree、rows和Extra;并定义输出列中seq_id为本节点的执行顺序、node_type为本节点的类型、node_id为本节点在执行计划树上的唯一编号、sql_info为待执行的SQL语句、node_tree为本节点在执行计划树上的位置、Extra为本节点的其他信息、type、key、key_len、rows为空。
进一步地,本发明实施例中:
语句处理模块320,还用于判断是否需要将所述SQL语句下发到数据库节点,并在需要时,向所述执行模块返回需要处理所述SQL语句的相应数据库节点信息;可选地,语句处理模块320,用于判断所述SQL语句是否带有指定的explain命令选项,若是,判定出需要将所述SQL语句下发到数据库节点;否则,不需要将所述SQL语句下发到数据库节点。
执行模块310,还用于在接收到所述数据库节点信息后,通过路由模块将所述SQL语句下发到相应的数据库节点,并接收各所述数据库节点返回的所述SQL语句在对应数据库节点上的explain;以及将DBproxy层的explain与各所述数据库节点返回的explain进行整合,得到分布式数据库的explain。
在一个具体实施例中,执行模块310,模拟所述执行计划树的执行流程,按照所述执行计划树中各节点的执行顺序,将各所述数据库节点返回的explain放置在DBproxy层对应节点的explain下,实现将DBproxy层的explain与各数据库节点返回的explain按照执行顺序整合在一起。
进一步地,本发明实施例中,执行模块310,还用于按需输出分布式数据库的explain、只输出DBproxy层的explain或者只输出各数据库节点的explain。具体的,本实施例中,仍然可以通过SQL语句中是否带有指定的explain命令选项,来判断是输出分布式数据库的explain,还是只输出DBproxy层或各数据库节点的explain。
综上可知,本发明实施例所述系统实现分布式数据库的explain获得SQL语句的执行计划,包括SQL语句在DBproxy自身内部的执行计划和SQL语句下发到数据库节点的执行计划。既可以单独显示SQL语句在MySQL数据库上的执行计划,又可以单独显示SQL语句在DBproxy上的执行计划,也可以全部显示SQL语句在DBproxy和数据库节点的执行计划信息。执行计划信息可以更好的帮助开发人员写出更优化的查询语句,通过优化SQL语句尽可能地将SQL语句下发到数据库上执行,从而充分利用数据库提供的计算和存储能力,避免将数据通过网络传递到DBProxy层上做操作,从而使查询语句的执行效率更高。
在本发明第三实施例中提供一种分布式数据库中的explain实现方法,其通过公开更多的技术细节对本发明的实施过程进行更详尽的说明。需要指出的如下公开的技术细节用于解释本发明,并不用于唯一限定本发明。需要指出的是,本实施例中出现的DB为“MySQL数据库”。
本发明实施例所述的分布式数据库explain技术包括SQL语句在MySQL数据库的explain和DBproxy层面的explain两方面。
为了实现DBproxy层面的explain,且便于将DBproxy层面的explain和MySQL数据库的explain二者整合在一起,需要设计出DBproxy层面的explain的输出列信息,确保与MySQL数据库的explain列信息相对应,因此要合理的设计显示的列信息内容,尽可能的复用MySQL数据库的explain输出列,使列的数量与位置和MySQL相同。
具体的,DBproxy层面的explain复用MySQL数据库的explain输出列,即列的数量与位置和MySQL数据库的explain相同,对应关系如下:
seq_id:表示节点的执行顺序,从10001开始编号,值越大表示越先被执行。根节点值最小,最后执行,最外层的子节点值最大。节点的seq_id有可能是相同的,表示这些节点是并行执行的。
node_id:节点在执行计划树上的唯一编号,从1开始,节点编号顺序递增。
node_tree:表示节点在执行计划树上的位置,内容包括父亲节点的node_id、子节点的node_id、兄弟节点的node_id。样式为Parent=XX,Child=XX,Next=XX。
node_type:表示本节点的类型,可以出现的类型如下表所述:
sql_info:表示待执行的SQL语句,不同的node_type,sql_info的输出是不一样的。
extra:表示本节点相关的其他信息,如读、写属性和分发属性等,形式为[ur|semi-cr|cr][sw|cw][gtid][select for update][lock in share mode][sort-merge|sort-merge-sort][Table Info][using group][using sort][using where],含义如下:
(1)读属性:ur、semi-cr、cr取其一,标识该语句对应的读事务属性;
(2)写属性:sw|cw取其一,标识该语句对应的写事务属性;
(3)gtid:标识本事务需要申请gitd;
(4)select for update:标识需要实施select for update;
(5)lock in share mode:标识需要实施lock in share mode;
(6)sort-merge|sort-merge-sort:标识DBproxy实施join的算法,sort-merge表示使用sort-merge算法,sort-merge-sort表示需要在DBproxy层排序后实施sort-merge算法;
(7)Table Info:标识本节点涉及的表的分布信息,形式为table_name=distribution Type[,table_name=distributionType],distributionType的取值有hash,list、range、rep,本信息仅针对本节点直接操作的表;其中,table_name为dbName.tableName;
(8)Using group:本节点,DBProxy实施了分组计算;
db_group:标识本节点上的SQL语句在哪个集群上的哪些安全组上执行,形式为ClusterN,gX[,gY],其中X、Y为对应的安全组编号,N为集群编号。UnionNode、JoinNode等类型的节点是在Proxy上实施的,不涉及具体的安全组,这时db_group列输出为空。
(9)Using sort:本节点,DBProxy实施了排序计算;
(10)Using where:本节点,DBProxy实施了条件过滤。
进一步地,本发明实施例中,还复用MySQL数据库的explain命令选项extended/partitions,具体的:
a.如果SQL语句带上extended选项则表示需要下发语句到DB进行explain,并且展示DBproxy和DB的explain结果。
b.如果SQL语句带上partitions选项也需要下发语句到DB进行explain,但是只展示MySQL数据库上的explain结果。
c.如果SQL语句不带任何选项的,则不下发语句到DB进行explain,只展示DBproxy的explain结果。
基于上述设计,本发明实施例提供的分布式数据库的explain实现方法,包括:分别获得SQL语句在DBproxy自身内部的执行计划和SQL语句下发到MySQL数据库的执行计划。下面结合所述方法的功能结构图,如图4所示,对本发明所述方法的实施过程进行详细阐述:
步骤1,执行模块从客户端接收到带有explain的SQL语句,分析SQL语句所属的模块(select/update/insert/delete模块),然后调用所属模块的入口函数生成执行计划树。各所属模块各自通过GetQuery函数获取SQL语句,完成DBproxy层执行计划树生成,并复用MySQL数据库的explain输出列,对所述执行计划树中的执行信息进行封装,得到SQL语句在DBproxy层的执行计划信息(即DBproxy层的explain);
步骤2、所属模块依据SQL语句是否有extended/partitions选项,判断是否需要下发DB执行该语句,若需要,则执行步骤3;若不需要,则执行步骤4;
步骤3,所属模块将需下发到DB执行的语句打标签,并向执行模块返回可执行节点,执行模块顺序调用每个可执行节点的GetQuery()函数,各可执行节点通过GetQuery()函数获取SQL语句,进行explain,并向执行模块返回SQL语句在MySQL数据库(即执行节点)上的执行计划信息。
步骤4、在DBproxy层面,执行模块调用SetSqlResult()函数和finish()函数接收并存储SQL语句在DB层的执行结果;等所有可执行节点都执行完后,执行模块调用根节点的SetexplainID()函数,驱动执行计划信息的汇总和处理,具体的,调用根节点的SetexplainID()函数模拟实现执行计划树的执行流程,将DBproxy的执行计划与MySQL数据库的执行计划按照一定的执行顺序整合到一起;
步骤5,执行模块调用GetExplainNode()获取所有的执行计划节点列表;
步骤6、执行模块依据SQL语句是否有extended/partitions选项字段,来判断是全部输出explain、只输出DBproxy的explain还是只输出DB层的explain。
在一个具体示例中,SQL语句全显示的执行计划如下表所示:
本示例中SQL语句为:Explain extended select id from tab1 join tab2 ontab1.id=tab2.id;
综上可知,本发明实施例所述方案既可以单独显示SQL语句在MySQL数据库上的执行计划,又可以单独显示SQL语句在DBproxy上的执行计划,也可以全部显示SQL语句在DBproxy和MySQL上的执行计划,能够一目了然的了解SQL语句的执行计划信息,为写出更优化的查询语句提供信息支持。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。