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

简介: 本文介绍如何排序(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 层的计算能力。

相关文章
|
存储 缓存 网络协议
你只会用 Java Sockets?推荐 11 个开源的 Java Socket 框架
你只会用 Java Sockets?推荐 11 个开源的 Java Socket 框架
2260 0
|
消息中间件 搜索推荐 Java
消息中间件JMS介绍、入门demo与spring整合
消息中间件JMS介绍、入门demo与spring整合
591 82
消息中间件JMS介绍、入门demo与spring整合
|
机器学习/深度学习 Web App开发 人工智能
全球名校AI课程库(8)| Berkeley伯克利 · 全栈深度学习训练营课程『Full Stack Deep Learnin』
课程以实战为主,讲解了不同场景下应用深度学习解决问题的工具、过程和方法:从问题理解,方法选择、数据管理、选择 GPU 到 Web 部署、监控和再训练。
2597 1
全球名校AI课程库(8)| Berkeley伯克利 · 全栈深度学习训练营课程『Full Stack Deep Learnin』
|
Web App开发 Dart 前端开发
Flutter 第一个程序Hello World!
Flutter 第一个程序Hello World!
496 1
Flutter 第一个程序Hello World!
|
JavaScript 安全 前端开发
Vue如何读取cookie实现路由守卫(检查用户登录状态)
一般实现路由守卫,判断用户的登录状态使用token和cookie验证两种方法,这次项目后端是给我提供的cookie验证,写到这里就记录一下,希望能帮助到你们
981 0
Vue如何读取cookie实现路由守卫(检查用户登录状态)
|
存储 SQL 监控
规则引擎 | 学习笔记
快速学习 规则引擎
1875 0
规则引擎 | 学习笔记
|
资源调度 JavaScript 前端开发
Vue3项目从0-1项目(手把手教学)
Vue3项目从0-1项目(手把手教学)
469 0
Vue3项目从0-1项目(手把手教学)
|
关系型数据库 MySQL 物联网
❤️Windows10环境下Docker安装主从MySQL5.7数据库❤️
❤️Windows10环境下Docker安装主从MySQL5.7数据库❤️
571 0
❤️Windows10环境下Docker安装主从MySQL5.7数据库❤️
|
存储 设计模式 算法
有限状态机FSM
关于状态机,以前写过[用Go实现一个状态机](https://mp.weixin.qq.com/s?__biz=MzUzNzAzMTc3MA==&mid=2247484850&idx=1&sn=5ba31ff066ddeeedab27f9ca9f1b9b58&scene=21#wechat_redirect),只是讲述了如何控制状态的流转,理论上不能算作完整的状态机。
|
XML JSON 文字识别
Android 百度翻译API(详细步骤+源码)
Android 百度翻译API(详细步骤+源码)
1345 0
Android 百度翻译API(详细步骤+源码)