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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 下推是查询改写的一项重要优化,利用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 
相关文章
|
传感器 Rust 安全
为什么物联网领域使用Rust的项目越来越多?
2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。
为什么物联网领域使用Rust的项目越来越多?
|
NoSQL PHP Redis
Mac PHP安装Redis扩展
php安装redis的扩展 采用pecl命令进行安装; pecl命令,在使用brew 安装php时,已经为我们安装上了,这里我们直接使用即可。 我们先进入php的bin目录看下命令是否存在,对应路径如下: cd /opt/homebrew/Cellar/php@7.3/7.3.32 这里的7.3为我通过brew install [php@7.3]安装的php具体版本号,大家可以通过ls命令查看文件夹下是否存在pecl命令
1651 0
|
分布式数据库 Hbase
HBase sequenceId知识点略记
在HBase中,sequenceId是实现一致性的灵魂,这里的一致性有两方面意思: 顺序性,即先写的先被读到,未提交的写不能被读到; 完整性,包含如下几点; 未持久化到hfile的数据,对应的wal文件不能删除 如果由于wal文件过多需要清理,则需要先把对应的数据持久化 异常恢复过程中,需要.
1976 0
|
7月前
|
运维 开发工具 虚拟化
简单配置RHEL9.X
本文介绍了切换系统默认运行级别的方法,包括临时和永久配置。通过调整运行级别,可将系统从图形界面切换至文本界面,优化资源占用或进行远程管理。同时,文章强调了制作系统快照的重要性,以确保在异常情况下快速恢复环境,并提供了创建与恢复快照的操作建议及策略。适用于服务器管理和虚拟化环境的风险控制场景。
简单配置RHEL9.X
|
C++
C++ 控制台窗口中MessageBox() 的用法
C++ 控制台窗口中MessageBox() 的用法
568 0
|
运维 分布式计算 DataWorks
阿里云大数据助力知衣科技打造AI服装行业核心竞争力
杭州知衣科技有限公司是一家以人工智能技术为驱动的国家高新技术企业,致力于将数据化趋势发现、爆款挖掘和供应链组织能力标准化输出,打造智能化服装设计的供应链平台。
3002 0
|
数据采集 分布式计算 Oracle
数据仓库的分层架构与演进
分层架构很容易在各种书籍和文档中去理解,但是把建模方法和分层架构放在一起就会出现很多困惑了。接下来,我会从数据研发与建模的角度,演进一下分层架构的设计原因与层次的意义。
16662 3
数据仓库的分层架构与演进
|
安全 物联网 Linux
针对 Linux 的恶意软件暴增 35%:XorDDoS、Mirai 和 Mozi 最盛行
针对 Linux 的恶意软件暴增 35%:XorDDoS、Mirai 和 Mozi 最盛行
644 0
针对 Linux 的恶意软件暴增 35%:XorDDoS、Mirai 和 Mozi 最盛行
|
安全 网络协议 数据安全/隐私保护
域前置通信过程和溯源思路
域前置通信过程和溯源思路
1562 0
域前置通信过程和溯源思路
|
安全 数据挖掘 数据安全/隐私保护
新一代蓝牙5.3到底有哪些新东西
2021年7月,蓝牙官方组织SIG释放了代码Syndney的5.3版本蓝牙核心协议文档,此版本仍在第5个大版本中,属于小功能升级,那这个版本带来了哪些功能升级呢?
新一代蓝牙5.3到底有哪些新东西

热门文章

最新文章