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 层的计算能力。

相关文章
html静态网页实例一(附完整代码)
html静态网页实例一(附完整代码)
2962 1
html静态网页实例一(附完整代码)
|
监控 前端开发 算法
前端性能体系建设与优化思路
Dev Better技术沙龙-前端性能及新技术实践 学习笔记总结
551 0
阿里云域名信息模板是什么?如何创建信息模板
注册阿里云域名需要账号下有已经通过实名认证的信息模板,否则无法注册,只能先创建域名信息模板再注册域名
2108 0
阿里云域名信息模板是什么?如何创建信息模板
|
固态存储 内存技术
SSD主控与NAND闪存之多通道交互
目前主流的SSD会有4或者8个Channel,SSD主控有一个专门的模块管理不同Channel之间的读写操作。
|
机器学习/深度学习
GAN Step By Step -- Step6 LSGAN
GAN Step By Step -- Step6 LSGAN
GAN Step By Step -- Step6 LSGAN
|
存储 安全 NoSQL
拥抱Spring全新OAuth解决方案
目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以**正式生产使用
1077 0
|
编解码 数据可视化 API
微软行星云计算Planetary Computer——Sentinel-2 Level-2A数据去云
微软行星云计算Planetary Computer——Sentinel-2 Level-2A数据去云
595 0
微软行星云计算Planetary Computer——Sentinel-2 Level-2A数据去云
|
消息中间件 分布式计算 Java
一文搞懂Kafka核心基础知识
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。Kafka 官网的下载地址是 https://kafka.apache.org/downloads ;打开下载页面后我们可以看 到不同版本的
|
存储 资源调度 Cloud Native
阿里云迁移工具推荐最佳实践:Hyper-V虚拟化迁移到阿里云
阿里云迁移工具推荐最佳实践:Hyper-V虚拟化迁移到阿里云
阿里云迁移工具推荐最佳实践:Hyper-V虚拟化迁移到阿里云
|
JavaScript
(四):vue 链接转二维码 并实现 下载功能
(四):vue 链接转二维码 并实现 下载功能
(四):vue 链接转二维码 并实现 下载功能