SQL调优指南—SQL调优进阶—查询改写与下推

简介: 下推是查询改写的一项重要优化,利用PolarDB-X的拆分信息来优化执行计划,使得算子尽量下推以达到提前过滤数据、减少网络传输、并行计算等目的。

背景信息

根据PolarDB-X的SQL语句优化的基本原则,可以下推尽量更多的计算到存储层MySQL上执行。可下推计算主要包括:

  • JOIN连接
  • 过滤条件(如WHEREHAVING
  • 计算(如COUNTGROUP BY
  • 排序(如ORDER BY
  • 去重(如DISTINCT
  • 函数计算(如NOW()函数)
  • 子查询

通过explain optimizer + sql可以看到查询改写的具体过程。

Project和Filter下推

一条SQL的执行计划在如下生成过程中,Filter和Project被先后下推到LogicalView算子里面。Filter和Project下推可以达到提前过滤数据,减少网络传输等效果。


mysql> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;

其中c_custkey是分区键。1111.png

背景信息

根据PolarDB-X的SQL语句优化的基本原则,可以下推尽量更多的计算到存储层MySQL上执行。可下推计算主要包括:

  • JOIN连接
  • 过滤条件(如WHEREHAVING
  • 计算(如COUNTGROUP BY
  • 排序(如ORDER BY
  • 去重(如DISTINCT
  • 函数计算(如NOW()函数)
  • 子查询

通过explain optimizer + sql可以看到查询改写的具体过程。

Project和Filter下推

一条SQL的执行计划在如下生成过程中,Filter和Project被先后下推到LogicalView算子里面。Filter和Project下推可以达到提前过滤数据,减少网络传输等效果。


mysql> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;

其中c_custkey是分区键。22222.png

拆分键不为c_nationkey情况:6666.png

JOIN下推

JOIN下推需要满足以下条件:

  • t1与t2表的拆分方式一致(包括分库键、分表键、拆分函数、分库分表数目)。
  • JOIN条件中包含t1,t2表拆分键的等值关系。此外,任意表JOIN广播表总是可以下推。


mysql> explain optimizer select * from t1, t2 where t1.id = t2.id;

一条SQL的执行计划在如下生成过程中,JOIN下推到LogicalView算子里面。JOIN下推可以达到计算离存储更近,并行执行加速的效果。1.1.png

JoinClustering

当有多个表执行JOIN操作时,PolarDB-X会通过join clustering的优化技术将JOIN进行重排序,将可下推的JOIN放到相邻的位置,从而让它可以被正常下推。示例如下:

假设原JOIN顺序为t2、t1、l2, 经过重排序之后,t2和l2的JOIN操作依然能下推到LogicalView。SQL复制代码


mysql> explain select t2.id from t2 join t1 on t2.id = t1.id join l2 on t1.id = l2.id;

Project(id="id")
HashJoin(condition="id = id AND id = id0", type="inner")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3],l2_[0-3]", shardCount=4, sql="SELECT `t2`.`id`, `l2`.`id` AS `id0` FROM `t2` AS `t2` INNER JOIN `l2` AS `l2` ON (`t2`.`id` = `l2`.`id`) WHERE (`t2`.`id` = `l2`.`id`)")
Gather(concurrent=true)
LogicalView(tables="t1", shardCount=2, sql="SELECT `id` FROM `t1` AS `t1`")

子查询下推

一条SQL的执行计划在如下生成过程中,子查询下推到LogicalView算子里面。子查询下推可以达到计算离存储更近,并行执行加速的效果。

  1. 子查询会先被转换成Semi JoinAnti Join
  2. 如果满足上节中JOIN下推的判断条件,就会将Semi JoinAnti Join下推至LogicalView
  3. 下推后的Semi JoinAnti Join会被还原为子查询。


explain optimizer select * from t1 where id in (select id from t2);

2.1.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
域名解析 网络协议 安全
DNS&BIND9安装配置
DNS概念,BIND9的详细配置安装
2106 2
|
算法 搜索推荐 Java
蓝桥杯攻略大全 | 学习路线 | 注意事项
蓝桥杯的攻略大全加经验,助你蓝桥杯路上畅通无阻
977 2
蓝桥杯攻略大全 | 学习路线 | 注意事项
|
安全 IDE API
RFSoC应用笔记 - RF数据转换器 -06- RFSoC关键配置之RF-ADC内部解析(4.1)
RFSoC应用笔记 - RF数据转换器 -06- RFSoC关键配置之RF-ADC内部解析
1735 0
RFSoC应用笔记 - RF数据转换器 -06- RFSoC关键配置之RF-ADC内部解析(4.1)
|
存储 小程序 Java
【笔记11】uniapp点击复制;mysql数据库存储emoji表情;Java 二维码生成;uniapp引入自定义图标
做公司的项目,给微信小程序体验版添加了新的页面,提交测试的时候没有任何效果。上网搜索了解后,知道:若 pages.json 文件发生了变化,尤其是首页路径发生了变化。代码上传成功后,需要在后台手动设置一下首页路径,或者取消体验版,重新生成体验版二维码。
850 0
【笔记11】uniapp点击复制;mysql数据库存储emoji表情;Java 二维码生成;uniapp引入自定义图标
|
存储 前端开发 API
低代码钉钉宜搭 TODOMVC 小白教程
TODOMVC for LCAP - Dingtalk YIDA
1469 0
低代码钉钉宜搭 TODOMVC 小白教程
|
Cloud Native 中间件 Java
CloudWeGo:云原生时代的微服务中间件
CloudWeGo 是字节跳动基础架构团队的开源项目,是一套可快速构建企业级云原生架构的中间件集合。企业级意味着项目面向企业级用户,从企业内部孵化出来,其特点是微服务通信与治理同时具备高性能、可扩展、高可靠三个突出性能,同时也非常注重用户体验和软件易用性。
CloudWeGo:云原生时代的微服务中间件
|
存储 SQL 缓存
分布式 PostgreSQL - Citus 架构及概念
分布式 PostgreSQL - Citus 架构及概念
1186 0
分布式 PostgreSQL - Citus 架构及概念
|
搜索推荐 安全 Java
IntelliJ Idea 常用快捷键列表
IntelliJ Idea 常用快捷键列表
896 0
IntelliJ Idea 常用快捷键列表
|
域名解析 Docker 容器
国外短域名的使用及跳转方法
国外短域名的使用及跳转方法
国外短域名的使用及跳转方法
|
Go 开发工具 C#
产品百科 |零门槛玩转 RTC Unity Demo
本章节为您介绍了 Unity Demo 的集成操作步骤。
产品百科 |零门槛玩转 RTC Unity Demo