

EXPLAIN [db|proxy] explainable_stmt [stroragedb]explainable_stmt: {SELECT statement| DELETE statement| INSERT statement| UPDATE statement}
EXPLAIN SELECT * FROM t1 WHERE id=1 or id=11 ORDER BY id;
例2:仅输出计算节点的分布式执行计划,此时需要PROXY选项。
EXPLAIN PROXY SELECT * FROM t1 WHERE id=1 or id=11 ORDER BY id;
例3:仅输出DB执行计划,此时需要使用DB选项,并指明要查看的存储节点。
EXPLAIN DB SELECT * FROM t1 WHERE id=1 or id=11 ORDER BY id STORAGEDB g2;

在GoldenDB分布式数据库中,表的数据通常是根据分片键(Sharding Key)进行水平切分的,这意味着相同分片键的数据会被存储在同一个数据节点(DN)上。当进行两表关联查询时,关联条件基于分片键和非分片键会有显著的性能和执行计划差异。
1、基于分片键的关联
当两表关联的条件是基于分片键时,GoldenDB可以高效地定位到需要参与关联的数据节点,并在这些节点上进行局部关联操作。这种情况下,通常只有少量的数据节点需要参与计算,网络传输的数据量也较少。该执行计划关键字select_type:SQLNode,当select_type为SQLNode时,CN层possible_keys语句展示为下发至DN层语句,CN层并未涉及关联匹配操作,这样会降低CN层CPU及内存消耗。
CN侧执行计划如下:
MySQL [hxbtest]> explain proxy SELECT a. * FROM test_200w_01 a left join test_2kw_01 b on a.id =b.id\G*************************** 1. row ***************************id: 10001 --根节点标记10001,子节点依次加1,执行顺序由大到小,id相同并行执行。select_type: SQLNode --CN层生成的节点类型,主要有JoinNode、UnionNode、SQLNode、MSQLNode节点。table: 1--CN层节点编号,根节点为1,遍历查询各子节点值依次增加。partitions: --CN层该字段为空。type: --CN层该字段为空。possible_keys: SELECT `hxbtest`.`a`.`ID`,`hxbtest`.`a`.`int01`,`hxbtest`.`a`.`int02`,`hxbtest`.`a`.`int03`,`hxbtest`.`a`.`char01` FROM (`hxbtest`.`test_200w_01` `a` left join `hxbtest`.`test_2kw_01` `b` on((`hxbtest`.`a`.`id` = `hxbtest`.`b`.`id`))) ----当select_type=JoinNode, UnionNode 时为CN层关于节点的语句;当select_type=SQLNode, MSQLNode 时为下发DN语句。key: Cluster1,g1,g2,g3,g4 ----当select_type=JoinNode, UnionNode是key=NULL;当select_type=SQLNode, MSQLNode时 key为下发group信息。key_len: --CN层该字段为空。ref: Parent=NULL,Child=NULL,Next=NULL --父子节点信息。rows: -- CN 层该字段为空。filtered: -- CN 层该字段为空。extra: ur, hxbtest.test_200w_01=hash,hxbtest.test_2kw_01=hash --隔离级别信息,表的分发信息。
当两表关联的条件不是基于分片键时,情况就变得复杂了。GoldenDB需要跨多个数据节点收集数据,并在计算节点(CN)进行全局关联操作。这通常涉及大量的数据传输和合并操作。该执行计划关键字select_type:JoinNode,当select_type为JoinNode时,CN层possible_keys语句展示为CN层语句。且出现子节点处理child0 = 2 child1 = 3,子节点select_type为SQLNode表示语句为下发至DN层处理,子节点处理完成后再执行父节点。CN层涉及语句拆分解析下发DN后,CN层关联匹配操作,这样会增加CN层CPU及内存消耗。
CN侧执行计划如下:
MySQL [hxbtest]> explain proxy SELECT a. * FROM test_200w_01 a left join test_2kw_01 b on a.id =b.int01\G*************************** 1. row ***************************id: 10001select_type: JoinNode --select_type为JoinNodetable: 1partitions:type:possible_keys:id = 1child0 = 2 child1 = 3 --涉及两个子节点left jointable : (nest_last_join) --将两个数据集连接(join)起来的操作on expr: (`hxbtest`.`b`.`int01` = `hxbtest`.`a`.`id`) --表达式Involved tables : hxbtest.b hxbtest.a --参与表rowLen() : 0id = 2, table = b --子节点处理信息sort key : hxbtest.b.int01 --需要排序字段involved tables : hxbtest.b --参与表field list : hxbtest.b.int01 --处理列表rowLen() : 0id = 3, table = a --子节点处理信息sort key : hxbtest.a.id --需要排序字段involved tables : hxbtest.a --参与表field list : hxbtest.a.id hxbtest.a.int01 hxbtest.a.int02 hxbtest.a.int03 hxbtest.a.char01 --处理列表rowLen() : 0key: nullkey_len:ref: Parent=NULL,Child=2,3,Next=NULL --子节点rows:filtered:extra: ur,sort-merge*************************** 2. row ***************************展示子节点具体处理信息id: 10002select_type: SQLNode --select_type为SQLNodetable: 2partitions:type:possible_keys: SELECT `hxbtest`.`b`.`int01` FROM `hxbtest`.`test_2kw_01` `b` order by `hxbtest`.`b`.`int01` ASC --DN层执行语句key: Cluster1,g1,g2,g3,g4 --涉及租户信息及分片信息key_len:ref: Parent=1,Child=NULL,Next=3 --父节点与下一子节点rows:filtered:extra: ur,using sort, hxbtest.test_2kw_01=hash --隔离级别信息,表的分发信息。*************************** 3. row ***************************展示子节点具体处理信息id: 10002select_type: SQLNode --select_type为SQLNodetable: 3partitions:type:possible_keys: SELECT `hxbtest`.`a`.`id`,`hxbtest`.`a`.`int01`,`hxbtest`.`a`.`int02`,`hxbtest`.`a`.`int03 FROM `hxbtest`.`test_200w_01` `a` order by `hxbtest`.`a`.`id` ASC --DN层执行语句key: Cluster1,g1,g2,g3,g4 --涉及租户信息及分片信息key_len:ref: Parent=1,Child=NULL,Next=NULL --父节点rows:filtered:extra: ur,using sort, hxbtest.test_200w_01=hash --隔离级别信息,表的分发信息。
GoldenDB由于完全兼容MySQL生态,在DN侧执行计划展示信息与MySQL较为相似,extra额外信息中会包含语句下发的分片信息,具体内容不做过多解释可参考公众号内文章《MySQL性能调优利器-Explain详解》。
MySQL [hxbtest]> explain DB SELECT a. * FROM test_200w_01 a left join test_2kw_01 b on a.id =b.id STORAGEDB g1\G*************************** 1. row ***************************id: 1select_type: SIMPLEtable: apartitions: NULLtype: ALLpossible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 8407733filtered: 100.00extra: NULL, g1*************************** 2. row ***************************id: 1select_type: SIMPLEtable: bpartitions: NULLtype: eq_refpossible_keys: PRIMARYkey: PRIMARYkey_len: 4ref: hxbtest.a.IDrows: 1filtered: 100.00extra: Using index, g1

查看GoldenDB的执行计划的意义主要体现在以下几个方面:
1、性能优化:执行计划详细描述了数据库如何检索数据。通过分析执行计划,可以确定哪些操作最耗时,哪些索引最有效,从而找到性能瓶颈并进行优化。
2、理解查询执行过程:执行计划提供了查询的详细执行步骤,有助于开发人员和数据库管理员深入理解查询的执行过程,从而更好地理解和控制查询行为。
3、诊断问题:如果查询性能不佳,查看执行计划可以帮助诊断问题所在。例如,如果某个操作特别耗时,那么可能是该操作需要优化或需要添加合适的索引。
4、评估查询效率:通过比较不同查询的执行计划,可以评估它们的效率,从而选择更有效的查询策略。






