当前位置: 首页 > news >正文

兰州企业网站建设哪家好乐清做网站哪家好

兰州企业网站建设哪家好,乐清做网站哪家好,个性logo图案,做HH的网站摘要#xff1a; 本文着重介绍 DRDS 执行计划中各个操作符的含义#xff0c;以便用户通过查询计划了解 SQL 执行流程#xff0c;从而有针对性的调优 SQL。DRDS分布式SQL引擎 — 执行计划介绍前言数据库系统中#xff0c;执行计划是对 SQL 如何执行的形式化表示#xff0c;…摘要 本文着重介绍 DRDS 执行计划中各个操作符的含义以便用户通过查询计划了解 SQL 执行流程从而有针对性的调优 SQL。 DRDS分布式SQL引擎 — 执行计划介绍前言数据库系统中执行计划是对 SQL 如何执行的形式化表示往往由若干关系操作符构成用户可以通过对应的 EXPLAIN 命令查看并通过执行计划大致了解 SQL 的执行过程和执行方式如全表扫描还是索引扫描归并连接还是哈希连接等。执行计划可以为用户进行 SQL 调优提供重要依据。DRDS 执行计划与多数数据库系统类似DRDS 在处理 SQL 时会通过优化器生成执行计划该执行计划由关系操作符构成一个树形结构反映 DRDS 如何执行 SQL 语句不同的是DRDS 本身不存储数据更侧重考虑分布式环境中的网络 IO 开销将运算下推到各个分库如 RDS/MySQL执行从而提升 SQL 执行效率。用户可通过 EXPLAIN 命令查看 SQL 的执行计划。本文着重介绍 DRDS 执行计划中各个操作符的含义以便用户通过查询计划了解 SQL 执行流程从而有针对性的调优 SQL。文中示例均基于如下表结构CREATE TABLE sbtest1 (id INT(10) UNSIGNED NOT NULL,k INT(10) UNSIGNED NOT NULL DEFAULT 0,c CHAR(120) NOT NULL DEFAULT ,pad CHAR(60) NOT NULL DEFAULT ,KEY xid (id),KEY k_1 (k) ) dbpartition BY HASH (id) tbpartition BY HASH (id) tbpartitions 4先通过一个例子整体了解 DRDS 执行计划的树形结构。mysql explain select a.k, count(*) cnt from sbtest1 a, sbtest1 b where a.id b.k and a.id 1000 group by k having cnt 1300 order by cnt limit 5, 10; --------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | --------------------------------------------------------------------------------------------------------------------------------------------------- | TmpSort(sortcnt ASC, offset?2, fetch?3) | | Filter(conditioncnt ?1) | | Aggregate(groupk, cntCOUNT()) | | BKAJoin(idid, kk, cc, padpad, id0id0, k0k0, c0c0, pad0pad0, conditionid k, typeinner) | | MergeSort(sortk ASC) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?) ORDER BY k) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE ((k ?) AND (k IN (?)))) | | HitCache:false | --------------------------------------------------------------------------------------------------------------------------------------------------- 9 rows in set (0.01 sec)如上DRDS EXPLAIN 的结果总体分为两部分执行计划和其他信息。执行计划执行计划以缩进形式表示操作符之间的 父-子 关系。示例中Filter 是 TmpSort 的子操作符同时是 Aggregate 的父操作符。从真正执行的角度看每个操作符均从其子操作符中获取数据经当前操作符处理输出给其父操作符。为方便理解将以上执行计划转换为更加直观的树形结构 其他信息除执行计划外EXPLAIN 结果中还会有一些额外信息目前仅有一项 HitCache 。需要说明的是DRDS 会默认开启 PlanCache 功能HitCache 表示当前 SQL 是否命中 PlanCache。开启 PlanCache 后DRDS 会对 SQL 做参数化处理参数化会将 SQL 中的大部分常量用 ? 替换并构建一个参数列表。在执行计划中的体现就是LogicalView 的 sql 中会有 ? 在部分操作符中会有类似 ?2 的字样这里的 2 表示其在参数列表中的下标后续会结合具体的例子进一步阐述。EXPLAIN 语法EXPLAIN 用于查看 SQL 语句的执行计划语法如下EXPLAIN explainable_stmtexplainable_stmt: {SELECT statement| DELETE statement| INSERT statement| REPLACE statement| UPDATE statement }操作符介绍本小节详细介绍 DRDS 执行计划中各个操作符的含义。LogicalViewLogicalView 是从底层数据源获取数据的操作符。从数据库的角度来看使用 TableScan 命名更符合常规但考虑到 DRDS 本身不存储数据而是通过 SQL 从底层数据源获取因此该操作符中会记录下推的 SQL 语句和数据源信息这更像一个 视图。该 视图 中的 SQL通过优化器的下推可能包含多种操作如投影、过滤、聚合、排序、连接和子查询等。以下通过示例说明 EXPLAIN 中 LogicalView 的输出信息及其含义mysql explain select * From sbtest1 where id 1000; ----------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ----------------------------------------------------------------------------------------------------------------------- | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | HitCache:false     | ----------------------------------------------------------------------------------------------------------------------- 3 rows in set (0.00 sec)LogicalView 的信息由三部分构成tables底层数据源对应的表名以 . 分割其前是分库对应的编号其后是表名及其编号对于连续的编号会做简写如 [000-127]表示表名编号从 000 到 127 的所有表。shardCount需要访问的分表总数该示例中会访问从 000 到 127 共 128 张分表。sql下发至底层数据源的 SQL 模版。这里显示的并非真正下发的 SQL 语句DRDS 在执行时会将表名替换为物理表名另外SQL 中的常量 10 被 ? 替换这是因为 DRDS 默认开启了 PlanCache 功能对 SQL 做了参数化处理。UnionAllUnionAll 是 UNION ALL 对应的操作符该操作符通常有多个输入表示将多个输入的数据 UNION 在一起。以上示例中LogicalView 之上的 UnionAll 表示将所有分表中的数据进行 UNION。UnionAll 中的 concurrent 表示是否并行执行其子操作符默认为 true。UnionDistinct与 UnionAll 类似UnionDistinct 是 UNION DISTINCT 对应的操作符。如下mysql explain select * From sbtest1 where id 1000 union distinct select * From sbtest1 where id 200; ------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ------------------------------------------------------------------------------------------------------------------------- | UnionDistinct(concurrenttrue) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | HitCache:false | ------------------------------------------------------------------------------------------------------------------------- 6 rows in set (0.02 sec)MergeSortMergeSort归并排序操作符通常有多个子操作符。DRDS 中实现了两种排序基于有序数据的归并排序和对无序数据的内存排序。如下mysql explain select *from sbtest1 where id 1000 order by id limit 5,10; --------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | --------------------------------------------------------------------------------------------------------------------------------------------------- | MergeSort(sortid ASC, offset?1, fetch?2) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?) ORDER BY id LIMIT (? ?)) | | HitCache:false | --------------------------------------------------------------------------------------------------------------------------------------------------- 3 rows in set (0.00 sec)MergeSort 操作符包含三部分内容sort表示排序字段以及排列顺序id ASC 表示按照 id 字段递增排序DESC 表示递减排序。offset表示获取结果集时的偏移量同样由于对 SQL 做了参数化示例中的 offst 表示为 ?1 其中 ? 表示这是一个动态参数其后的数字对应参数列表的下标。示例中 SQL 对应的参数为 [1000, 5, 10]因此?1 实际对应的值为 5。fetch表示最多返回的数据行数。与 offset 类似同样是参数化的表示实际对应的值为 10。AggregateAggregate 是聚合操作符通常包含两部分内容Group By 字段和聚合函数。如下mysql explain select k, count(*) from sbtest1 where id 1000 group by k; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Aggregate(groupk, count(*)SUM(count(*))) | | MergeSort(sortk ASC) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT k, COUNT(*) AS count(*) FROM sbtest1 WHERE (id ?) GROUP BY k ORDER BY k) | | HitCache:true | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4 rows in set (0.00 sec)Aggregate 包含两部分内容group表示 GROUP BY 字段示例中为 k 。聚合函数 前为聚合函数对应的输出列名其后为对应的计算方法。示例中 count(*)SUM(count(*)) 第一个 count(*) 对应输出的列名随后的 SUM(count(*)) 表示对其输入数据中的 count(*) 列进行 SUM 运算得到最终的 count(*)。由此可见DRDS 将聚合操作分为两部分首先将聚合操作下推至底层数据源做局部聚合最终在 DRDS 层面对局部聚合的结果做全局聚合。另外DRDS 的最终聚合是基于排序做的因此会在优化器阶段为其添加一个 Sort 子操作符而 Sort 操作符又进一步通过下推 Sort 转换为 MergeSort。再来看一个 AVG 聚合函数的例子如下mysql explain select k, avg(id) avg_id from sbtest1 where id 1000 group by k; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Project(kk, avg_idsum_pushed_sum / sum_pushed_count)| | Aggregate(groupk, sum_pushed_sumSUM(pushed_sum), sum_pushed_countSUM(pushed_count))| | MergeSort(sortk ASC)| | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT k, SUM(id) AS pushed_sum, COUNT(id) AS pushed_count FROM sbtest1 WHERE (id ?) GROUP BY k ORDER BY k)| | HitCache:false| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 5 rows in set (0.01 sec)DRDS 会将 AVG 聚合函数转换为 SUM / COUNT再分别根据 SUM 和 COUNT 的下推规则将其转换为局部聚合和全局聚合。用户可自行尝试了解其他聚合函数的执行计划。注意DRDS 会将 DISTINCT 操作转换为 GROUP 操作如下mysql explain select distinct k from sbtest1 where id 1000; ----------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ----------------------------------------------------------------------------------------------------------------------------------------------------- | Aggregate(groupk) | | MergeSort(sortk ASC) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT k FROM sbtest1 WHERE (id ?) GROUP BY k ORDER BY k) | | HitCache:false | ----------------------------------------------------------------------------------------------------------------------------------------------------- 4 rows in set (0.02 sec)TmpSortTmpSort表示在内存中对数据进行排序。与 MergeSort 的区别在于MergeSort 可以有多个子操作符且每个子操作符返回的数据都已经排序。TmpSort 仅有一个子操作符。TmpSort 对应的查询计划信息与 MergeSort 一致请参考 MergeSort。ProjectProject 表示投影操作即从输入数据中选择部分列输出或者对某些列进行转换通过函数或者表达式计算后输出当然也可以包含常量。以上 AVG 的示例中最顶层就是一个 Project其输出 k 和 sum_pushed_sum / sum_pushed_count 后者对应的列名为 avg_id 。mysql explain select 你好, DRDS, 1 / 2, CURTIME(); ------------------------------------------------------------------------------------- | LOGICAL PLAN | ------------------------------------------------------------------------------------- | Project(你好, DRDS_UTF-16你好, DRDS, 1 / 21 / 2, CURTIME()CURTIME()) | | | | HitCache:false | ------------------------------------------------------------------------------------- 3 rows in set (0.00 sec)可见Project 的计划中包括每列的列名及其对应的列、值、函数或者表达式。FilterFilter 表示过滤操作其中包含一些过滤条件。该操作符对输入数据进行过滤若满足条件则输出否则丢弃。如下是一个较复杂的例子包含了以上介绍的大部分操作符。mysql explain select k, avg(id) avg_id from sbtest1 where id 1000 group by k having avg_id 1300; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Filter(conditionavg_id ?1) | | Project(kk, avg_idsum_pushed_sum / sum_pushed_count) | | Aggregate(groupk, sum_pushed_sumSUM(pushed_sum), sum_pushed_countSUM(pushed_count)) | | MergeSort(sortk ASC) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT k, SUM(id) AS pushed_sum, COUNT(id) AS pushed_count FROM sbtest1 WHERE (id ?) GROUP BY k ORDER BY k) | | HitCache:false | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 6 rows in set (0.01 sec)在以上 AVG 示例的 SQL 基础上添加了having avg_id 1300 执行计划最上层添加了一个 Filter 操作符用于过滤所有满足 avg_id 1300 的数据。有读者可能会问WHERE 中的条件为什么没有对应的 Filter 操作符呢在 DRDS 优化器的某个阶段WHERE 条件的 Filter 操作符的确是存在的只是最终将其下推到了 LogiacalView 中因此可以在 LogicalView 的 sql 中看到 id 1000 。NlJoinNlJoin表示 NestLoop Join 操作符即使用 NestLoop 方法进行两表 Join。DRDS 中实现了两种 JOIN 策略NlJoin 和 BKAJoin后者表示 Batched Key Access Join批量键值查询会从左表取一批数据构建一个 IN 条件拼接在访问右表的 SQL 中从右表一次获取一批数据。mysql explain select a.* from sbtest1 a, sbtest1 b where a.id b.k and a.id 1000; ---------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ---------------------------------------------------------------------------------------------------------------------------- | Project(idid, kk, cc, padpad) | | NlJoin(idid, kk, cc, padpad, k0k0, conditionid k, typeinner) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT k FROM sbtest1 WHERE (k ?)) | | HitCache:false | ---------------------------------------------------------------------------------------------------------------------------- 7 rows in set (0.03 sec)NlJOIN 的计划包括三部分内容输出列信息输出的列名示例中的 JOIN 会输出 5 列 idid, kk, cc, padpad, k0k0 。contition连接条件示例中连接条件为 id k 。type连接类型示例中是 INNER JOIN因此其连接类型为 inner 。BKAJoinBKAJoinBatched Key Access Join表示通过批量键值查询的方式进行 JOIN即从左表取一批数据构建一个 IN 条件拼接在访问右表的 SQL 中从右表一次获取一批数据进行 JOIN。mysql explain select a.* from sbtest1 a, sbtest1 b where a.id b.k order by a.id; ------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ------------------------------------------------------------------------------------------------------------------------------- | Project(idid, kk, cc, padpad) | | BKAJoin(idid, kk, cc, padpad, id0id0, k0k0, c0c0, pad0pad0, conditionid k, typeinner) | | MergeSort(sortid ASC) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 ORDER BY id) | | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (k IN (?))) | | HitCache:false | ------------------------------------------------------------------------------------------------------------------------------- 7 rows in set (0.01 sec)BKAJoin 的计划内容与 NlJoin 相同这两个操作符命名不同旨在告知执行器以何种方法执行 JOIN 操作。另外以上执行计划中右表的 LogicalView 中 k IN (?) 是优化器构建出来的对右表的IN查询模板。LogicalModifyView如上文介绍LogicalView 表示从底层数据源获取数据的操作符与之对应的LogicalModifyView 表示对底层数据源的修改操作符其中也会记录一个 SQL 语句该 SQL 可能是 INSERT、UPDATE 或者 DELETE。mysql explain update sbtest1 set cHello, DRDS where id 1000; -------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | -------------------------------------------------------------------------------------------------------------------------------- | LogicalModifyView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlUPDATE sbtest1 SET c ? WHERE (id ?)) | | HitCache:false | -------------------------------------------------------------------------------------------------------------------------------- 2 rows in set (0.03 sec)mysql explain delete from sbtest1 where id 1000; ------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ------------------------------------------------------------------------------------------------------------------------- | LogicalModifyView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlDELETE FROM sbtest1 WHERE (id ?)) | | HitCache:false | ------------------------------------------------------------------------------------------------------------------------- 2 rows in set (0.03 sec)LogicalModifyView 查询计划的内容与 LogicalView 类似包括下发的物理分表分表数以及 SQL 模版。同样由于开启了 PlanCache对 SQL 做了参数化处理SQL 模版中的常量会用 ? 替换。PhyTableOperationPhyTableOperation 表示对某个物理分表执行一个操作。该操作符目前仅用于 INSERT INTO ... VALUES ...。mysql explain insert into sbtest1 values(1, 1, 1, 1),(2, 2, 2, 2); -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | PhyTableOperation(tablesSYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_001], sqlINSERT INTO ? (id, k, c, pad) VALUES(?, ?, ?, ?), paramssbtest1_001,1,1,1,1) | | PhyTableOperation(tablesSYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_002], sqlINSERT INTO ? (id, k, c, pad) VALUES(?, ?, ?, ?), paramssbtest1_002,2,2,2,2) | | | | HitCache:false | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4 rows in set (0.00 sec)示例中INSERT 插入两行数据每行数据对应一个 PhyTableOperation 操作符PhyTableOperation 操作符的内容包括三部分tables物理表名仅有唯一一个物理表名。sqlSQL 模版该 SQL 模版中表名和常量均被参数化用 ? 替换对应的参数在随后的 params 中给出。paramsSQL 模版对应的参数包括表名和常量。其他信息HitCacheDRDS 会默认开启 PlanCache 功能HitCache 用于告知用户当前查询是否命中 PlanCache。如下第一次运行 HitCache 为 false第二次运行为 true。mysql explain select * From sbtest1 where id 1000; ----------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ----------------------------------------------------------------------------------------------------------------------- | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | HitCache:false     | ----------------------------------------------------------------------------------------------------------------------- 3 rows in set (0.01 sec)mysql explain select * From sbtest1 where id 1000; ----------------------------------------------------------------------------------------------------------------------- | LOGICAL PLAN | ----------------------------------------------------------------------------------------------------------------------- | UnionAll(concurrenttrue) | | LogicalView(tables[0000-0031].sbtest1_[000-127], shardCount128, sqlSELECT * FROM sbtest1 WHERE (id ?)) | | HitCache:true | ----------------------------------------------------------------------------------------------------------------------- 3 rows in set (0.00 sec)小结以上介绍了 DRDS 5.3 的 EXPLAIN 命令以及执行计划中每个操作符的含义相信可以为用户调优 SQL 提供极大得便利。DRDS 5.3 已经在阿里云正式上线除全新设计的执行计划外性能也有大幅提升并支持原生事务、Outline 和 Plan Cache 等功能。后续支持复杂查询的只读实例、回收站、基于事务的广播表写入等功能也将相继上线敬请期待。 原文链接本文为云栖社区原创内容未经允许不得转载。
http://www.pierceye.com/news/680899/

相关文章:

  • 培训做网站传奇手游发布网站
  • 中国保密在线网站培训系统手机购物平台
  • 厦门网站制作建设沐风 wordpress 主题
  • 网站选择城市怎么做北京招聘信息
  • 一个做搞笑类视频的网站取名手机端企业网站源码
  • 房地产网站模板网站建设论文范文
  • 任丘网站制作公司pc网站制作公司
  • 惠州城乡规划建设局网站工程公司经营范围
  • 淮南服装网站建设地址巴彦淖尔网站建设公司
  • 如何让自己的网站被百度收录wordpress 悬浮网易云
  • 天津展示型网站建设外包腾讯云wordpress镜像
  • python做网站点登入没反映wordpress母公司
  • 中国建设培训网站查询系统地产项目网站建设ppt
  • 温州高端网站建设网站开发实验心得
  • 设计参考网站有哪些陕西省西安市事业单位招聘网
  • 月编程做网站wordpress需要调用缩略图
  • 做一份网站动态图多少钱网站托管服务公司
  • 宣传式网站营销型网站套餐
  • 建设网站如何优化关键词江门排名优化公司
  • 做教学的视频网站wordpress小工具推荐
  • 唯品会专门做特卖的网站保险行业网站模板
  • 电商类公司网站应该怎么搭建广州做网站公司哪家比较好
  • 企业网站实名认证时间怎样开通微信公众号
  • 怎么才能在百度上搜到自己的网站如何优化网站
  • 酒泉网站建设价格福清市建设局网站
  • 网站建设有几种厦门网站的建设
  • 沈阳网站外包通过法人姓名查企业
  • 建设网站的多少钱红色风格网站
  • 公司网站运营维护单位温州h5建站
  • 做网站想注册商标是哪一类网站上线具体流程