SQL调优指南—SQL调优进阶—排序优化和执行

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍如何排序(Order-by)算子,以达到减少数据传输量和提高执行效率的效果。

基本概念

排序操作(Sort)语义为按照指定的ORDER BY列对输入进行排序。本文介绍均为不下推的Sort的算子的实现。如果已被下推到LogicalView中,则由存储层MySQL来选择执行方式。

排序(Sort)

PolarDB-X中的排序算子主要包括 MemSort、TopN,以及 MergeSort。

MemSort

PolarDB-X中的通用的排序实现为MemSort算子,即内存中运行快速排序(Quick Sort)算法。下面是一个用到MemSort算子的例子:


> explain select t1.name from t1 join t2 on t1.id = t2.id order by t1.name,t2.name;
Project(name="name")
  MemSort(sort="name ASC,name0 ASC")
    Project(name="name", name0="name0")
      BKAJoin(condition="id = id", type="inner")
        Gather(concurrent=true)
          LogicalView(tables="t1", shardCount=2, sql="SELECT `id`, `name` FROM `t1` AS `t1`")
        Gather(concurrent=true)
          LogicalView(tables="t2_[0-3]", shardCount=4, sql="SELECT `id`, `name` FROM `t2` AS `t2` WHERE (`id` IN ('?'))")

TopN

当SQL中ORDER BY和LIMIT一起出现时,Sort算子和Limit算子会合并成TopN算子。

TopN算子维护一个最大或最小堆,按照排序键的值,堆中始终保留最大或最小的N行数据。当处理完全部的输入数据时,堆中留下的N个行(或小于N个)就是需要的结果。


> explain select t1.name from t1 join t2 on t1.id = t2.id order by t1.name,t2.name limit 10;

Project(name="name")
TopN(sort="name ASC,name0 ASC", offset=0, fetch=?0)
Project(name="name", name0="name0")
BKAJoin(condition="id = id", type="inner")
Gather(concurrent=true)
LogicalView(tables="t1", shardCount=2, sql="SELECT `id`, `name` FROM `t1` AS `t1`")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3]", shardCount=4, sql="SELECT `id`, `name` FROM `t2` AS `t2` WHERE (`id` IN ('?'))")

MergeSort

通常,只要语义允许,SQL中的排序操作会被下推到MySQL上执行,而PolarDB-X执行层只做最后的归并操作,即MergeSort。严格来说,MergeSort 不仅仅是排序,更是一种数据重分布算子(类似 Gather)。下面的SQL是对t1表进行排序,经过PolarDB-X查询优化器的优化,Sort算子被下推至各个MySQL分片中执行,最终只在上层做归并操作。


> explain select name from t1 order by name;
MergeSort(sort="name ASC")
LogicalView(tables="t1", shardCount=2, sql="SELECT `name` FROM `t1` AS `t1` ORDER BY `name`")

相比 MemSort,MergeSort 算法可以减少PolarDB-X层的内存消耗,并充分利用 MySQL 层的计算能力。

相关文章
|
存储 开发框架 JSON
区块链开发必备的9个Rust包
Rust是新一代的潜力巨大的开发语言。本文编辑整理了9个主流的用于以太坊、比特币、tendermint、eosio、polkadot等区块链开发的Rust包,可用于区块链应用的快速开发。
2569 0
|
程序员 C# 数据安全/隐私保护
【C#】发送QQ邮箱信息之步骤和代码实现
本篇文章就来讲讲,通过C#来实现,发送消息到QQ邮箱 使用场景可以是发送一些通知,或者重置密码通知之类,甚至是验证码,提高安全性
|
编解码 数据安全/隐私保护
SATA系列专题之二: 2.1 Link layer链路层8b/10b编码解析
8b/10b编码是目前高速串行通信中经常用到的一种编码方式,直观的理解就是把8bit数据编码成10bit来传输。
|
计算机视觉
基于OpenCV实现对图片及视频中感兴趣区域颜色识别
基于OpenCV实现对图片及视频中感兴趣区域颜色识别
基于OpenCV实现对图片及视频中感兴趣区域颜色识别
|
算法
遗传算法五大基本要素——参数编码、群体设定
遗传算法主要借用生物进化中的“适者生存”的规律。 遗传算法包括两个数据转换操作,一个是从表现型到基因型的转换,将搜索空间中的`参数或解`转化成遗传空间中的`染色体或者个体`,这个过程叫做编码(coding)。另一个就是从基因型到变现型的转换,即将个体转换成搜索空间中的参数,这个过程叫做解码(decode)。 遗传算法中包含了五个基本要素:参数编码,初始群体的设定,适应度函数的设计;遗传操作设计和控制参数设定。 由于遗传算法不能直接处理问题空间的参数,因此,必须通过编码将要求解的问题表示成遗传空间的染色体或者个体。它们由基因按一定的结构组成。由于遗传算法的健壮性,对编码的要求并不苛刻。对一
1541 0
|
弹性计算 Java 运维
麒麟部署平台使用指南
在产品生态合作伙伴控制台上部署产品
1648 1
麒麟部署平台使用指南
|
Java 应用服务中间件 Android开发
IDEA 中无法使用 JSP 内置对象
在 IDEA 中编写JSP 时,无法使用 JSP 的内置对象的原因和解决方案
IDEA 中无法使用 JSP 内置对象
|
存储 NoSQL 数据可视化
【Elastic Engineering】Beats:Beats 入门教程 (一)
在今天的这个教程里,我们来针对初学者如何快速地了解 Beats 是什么,并如何快速地部署 Beats。如果你想了解更多关于 Beats 方面的知识,可以参阅我的文章。
1082 0
【Elastic Engineering】Beats:Beats 入门教程 (一)
|
机器学习/深度学习 人工智能 编解码
苹果首发 5nm 芯片 A14,搭载全新六核 CPU,集成 118 亿个晶体管
苹果首发 5nm 芯片 A14,搭载全新六核 CPU,集成 118 亿个晶体管
苹果首发 5nm 芯片 A14,搭载全新六核 CPU,集成 118 亿个晶体管
|
存储 分布式计算 数据可视化
闲鱼SPU体系构建的背后
SPU——结构化的利器+闲鱼商品的翻译官~
1219 0
闲鱼SPU体系构建的背后