一文读懂AnalyticDB MySQL过滤条件智能下推原理

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 在常规认知中,过滤条件肯定是推的越靠近底层越好,将尽可能多的过滤条件更贴近存储层数据源,以使查询时能跳过无关的数据,但是过滤条件下推到存储层一定会快吗?

【先打一波小广告】

阿里云AnalyticDB MySQL升级为湖仓一体架构,支持高吞吐离线处理和高性能在线分析,可无缝替换CDH/TDH/Databricks/Presto/Spark/Hive等。试用活动(5000ACU时+100GB存储)正在火热申请中,申请链接:https://free.aliyun.com/?searchKey=AnalyticDB%20MySQL,群号:33600023146

前置知识

原创西月栋(西问

过滤条件下推

在我们的常规认知中,过滤条件肯定是推的越靠近底层越好,将尽可能多的过滤条件更贴近数据源,以使查询时能跳过无关的数据,在AnalyticDB MySQL中,由于存储计算分离架构,那么谓词下推就是把所有能推的谓词都推到存储节点上去做。比如下图,所有的过滤条件都推到存储节点上去做,这样减少了后续算子的计算量,也减少了中间网络传输的数据量。谓词下推带来了很多的好处,基本上所有数据库,都会把谓词下推作为他们重要的优化功能。


全下推到存储弊端

但是过滤条件下推到存储层一定会快吗?

为了弄清这个问题,我们先来看一下AnalyticDB MySQL的存储节点的索引结构。ADB目前默认是全索引,即会为所有列创建索引,并且支持多个条件同时走索引,快速多路合并,能够在毫秒级别找出满足条件的结果集。下图展示了一个表上多个过滤条件的索引查找过程。可以看到是每一列都会查找索引,最后将RowIds做交并差集运算。


不下推 VS 下推

了解完索引结构后,我们构造一个简单的例子,来说明过滤条件下推到存储之后却变慢的情况。我们简单假设一个代价模型,每一行扫索引的代价是A,每一行取明细以及数据传输的代价是B,计算层每一行过滤的代价是C。并考虑如下sql。

createtable user (age int, id int);selectcount(*)from user;-- 结果10,000;selectcount(*)from user where age >18;-- 结果9,000selectcount(*)from user where id <10;-- 结果 20-- 考虑如下sqlselect*from user where age >18and id <10-- 结果 10

常规计划代价 10,000A + 10,000A + 10B (两列分别查索引的代价 + 取明细以及数据传输的代价)


Id列不下推计划代价 10,000A + 20B + 20C (一列查索引代价 + 取明细以及数据传输的代价 +计算层代价)

可以看出如果 10B + 20C < 10,000A 的话,Id列不下推计划是更优的计划。


可优化场景

默认情况下,优化器会将所有带索引的列下推存储,从而减少读取至计算引擎的数据。但是仍存在几种场景不建议使用索引过滤数据:

谓词选择率高,且谓词条件多,数据经过过滤后返回的数据仍然很多,那么使用索引进行数据过滤然后取交集的效果不一定好。


磁盘IO压力大。如果用户业务的查询特征是占用较多的IO资源,或者数据写入较多导致占用了较多IO资源,那么使用索引进行数据过滤时,存在磁盘IO资源的争抢,过滤效果也可能较差。


过滤谓词中带有复杂操作,比如字符串比较,LIKE操作等,会对存储节点产生较大的资源消耗,如果其他条件过滤后数据不多,不下推会对整体性能更加友好。


智能下推

所以为了优化ADB上述场景的性能,同时也为了避免ADB研发人员和用户耗费精力使用不下推hint来进行sql调优,在ADB新版本推出了智能优化功能,优化器基于准确的统计信息,在ADB中智能控制过滤条件是否下推到存储节点,让用户不用再纠结于是否下推的sql调优,加速用户查询,把简单交给用户。


术语定义

▶︎ conjunction

我们把过滤条件按照最外层的AND拆分之后的单元叫做conjunction,比如 ((A & B) | C) & D & E 就是由 ((A & B) | C), D,E 三个conjunction组成的。只所以这么定义是,conjunction是是否下推到存储的最小单元。一个conjunction里面的条件要么都下推,要么都不下推。


▶︎ selectivity

谓词的过滤度,如果有100行数据,满足A>10的数据是10行,那么A>10的selectivity是10%


▶︎ connector

ADB 优化器支持多个connector,既可以支持ADB本身存储引擎,也可以支持OSS外表。不同的connector需要不同的处理。

实现


▶︎ A series of rules这里是ADB优化器原有的一系列过滤条件下推的规则,会尽量把filter一路推到 table 上方,推到距离存储节点最近的地方,然后下面的工作便交给了智能下推模块。智能下推模块来决定什么谓词可以继续推给存储节点。▶︎ Pretreatment短路优化:在模块的开始会粗略判断整个表扫描的开销,比如是个很小的表,那就快速跳过,以减少后续流程处理的额外开销表达式转化:应用布尔代数定律,尽量将过滤条件转换为AND连接。拿一个简单的例子来说,( A & B ) | ( C & D ) 是无法做到部分下推,部分不下推的,但是将其转换为( A | C ) & ( A | D ) & ( B | C ) & ( B | D)之后。便可以做到部分下推。这一步进行了限制,不会盲目转化,因为转换之后的表达式变长,可能会导致codegen超限等影响。


▶︎ CalcSelectivity

在这里会根据直方图等精准的statistics,调用ADB优化器中的Cardinality Estimation模块去为每个conjunction计算selectivity和相应的reliability。这个模块依托ADB优化器中精准的统计信息以及完善的基数估计,提供高质量的选择率,为后续的代价的计算以及下推方案的选择,提供准确的输入。


▶︎ Connector Cost Model

存储层自定义的代价模型,定义了根据selectivity计算出来的cost满足一定条件的过滤条件不会下推。这种分离的模式使得接入ADB的别的存储层,有智能下推的需求,也可以简单实现connector cost model,便可以实现智能下推的功能。


▶︎ FilterPushDownSelection这个模块负责将所有的conjunction以及其selectivity和reliability输入给相应的connector cost model,然后以conjunction为最小单元枚举下推组合,模型算出代价,最后根据代价去选择开销最低的下推方案。这样下来,ADB便有之前的全下推,演变为现在的智能下推。


全下推 VS 智能下推效果

下图展示了一些索引扫描耗时占比大的查询使用智能下推后的加速效果。数据来源于内部灰度客户在智能下推开启前后,线上sql的平均RT变化。可以看到有着十分明显的性能提升。

                                                   image.png

结语

在数据库和大数据等相关领域,查询优化十分重要。实际生产中的问题,远比本文提到的要复杂。篇幅有限,更多技术细节没有深究。AnalyticDB 作为国内领先的云原生数仓和 TPC-DS 世界记录保持者,在查询优化技术上不断投入和创新。对技术感兴趣的同学,欢迎加入 AnalyticDB 社区讨论。(云数据仓库ADB-开发者群:钉钉群号 23128105)





相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
8天前
|
关系型数据库 MySQL Linux
MySQL原理简介—6.简单的生产优化案例
本文介绍了数据库和存储系统的几个主题: 1. **MySQL日志的顺序写和数据文件的随机读指标**:解释了磁盘随机读和顺序写的原理及对数据库性能的影响。 2. **Linux存储系统软件层原理及IO调度优化原理**:解析了Linux存储系统的分层架构,包括VFS、Page Cache、IO调度等,并推荐使用deadline算法优化IO调度。 3. **数据库服务器使用的RAID存储架构**:介绍了RAID技术的基本概念及其如何通过多磁盘阵列提高存储容量和数据冗余性。 4. **数据库Too many connections故障定位**:分析了MySQL连接数限制问题的原因及解决方法。
|
28天前
|
存储 缓存 数据挖掘
StarRocks 原理详解:探索高效 OLAP 的奥秘
StarRocks 是一款高性能分析型数据仓库,采用向量化、MPP架构、CBO等技术,实现多维、实时、高并发的数据分析。它支持从各类数据源高效导入数据,兼容MySQL协议,并具备水平扩展、高可用等特性,广泛应用于实时数仓、OLAP报表等场景。StarRocks 解决了传统数仓在查询性能、数据导入、扩展性和灵活性等方面的挑战,助力企业实现数据驱动的决策。其分布式架构和智能物化视图等功能显著提升了查询效率,适用于大数据生态中的各种复杂需求。
212 15
|
9天前
|
SQL Java 关系型数据库
MySQL原理简介—3.生产环境的部署压测
本文介绍了Java系统和数据库在高并发场景下的压测要点: 1. 普通系统在4核8G机器上每秒能处理几百个请求 2. 高并发下数据库建议使用8核16G或更高配置的机器 3. 数据库部署后需进行基准压测,以评估其最大承载能力 4. QPS和TPS的区别及重要性 5. 压测时需关注IOPS、吞吐量、延迟 6. 除了QPS和TPS,还需监控CPU、内存、磁盘IO、网络带宽 7. 影响每秒可处理并发请求数的因素包括线程数、CPU、内存、磁盘IO和网络带宽 8. Sysbench是数据库压测工具,可构造测试数据并模拟高并发场景 9. 在增加线程数量的同时,必须观察机器的性能,确保各硬件负载在合理范围
113 72
|
11天前
|
SQL 存储 关系型数据库
MySQL原理简介—1.SQL的执行流程
本文介绍了MySQL驱动、数据库连接池及SQL执行流程的关键组件和作用。主要内容包括:MySQL驱动用于建立Java系统与数据库的网络连接;数据库连接池提高多线程并发访问效率;MySQL中的连接池维护多个数据库连接并进行权限验证;网络连接由线程处理,监听请求并读取数据;SQL接口负责执行SQL语句;查询解析器将SQL语句解析为可执行逻辑;查询优化器选择最优查询路径;存储引擎接口负责实际的数据操作;执行器根据优化后的执行计划调用存储引擎接口完成SQL语句的执行。整个流程确保了高效、安全地处理SQL请求。
131 75
|
7天前
|
SQL 存储 关系型数据库
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
|
5天前
|
存储 关系型数据库 MySQL
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
|
6天前
|
SQL 监控 关系型数据库
MySQL原理简介—12.MySQL主从同步
本文介绍了四种为MySQL搭建主从复制架构的方法:异步复制、半同步复制、GTID复制和并行复制。异步复制通过配置主库和从库实现简单的主从架构,但存在数据丢失风险;半同步复制确保日志复制到从库后再提交事务,提高了数据安全性;GTID复制简化了配置过程,增强了复制的可靠性和管理性;并行复制通过多线程技术降低主从同步延迟,保证数据一致性。此外,还讨论了如何使用工具监控主从延迟及应对策略,如强制读主库以确保即时读取最新数据。
MySQL原理简介—12.MySQL主从同步
|
8天前
|
SQL 缓存 关系型数据库
MySQL原理简介—7.redo日志的底层原理
本文介绍了MySQL中redo日志和undo日志的主要内容: 1. redo日志的意义:确保事务提交后数据不丢失,通过记录修改操作并在系统宕机后重做日志恢复数据。 2. redo日志文件构成:记录表空间号、数据页号、偏移量及修改内容。 3. redo日志写入机制:redo日志先写入Redo Log Buffer,再批量刷入磁盘文件,减少随机写以提高性能。 4. Redo Log Buffer解析:描述Redo Log Buffer的内存结构及刷盘时机,如事务提交、Buffer过半或后台线程定时刷新。 5. undo日志原理:用于事务回滚,记录插入、删除和更新前的数据状态,确保事务可完整回滚。
|
8天前
|
SQL 缓存 关系型数据库
MySQL原理简介—8.MySQL并发事务处理
这段内容深入探讨了SQL语句执行原理、事务并发问题、MySQL事务隔离级别及其实现机制、锁机制以及数据库性能优化等多个方面。
|
10天前
|
存储 SQL 缓存
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。

热门文章

最新文章

相关产品

  • 云原生数据仓库AnalyticDB MySQL版