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

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: AnalyticDB智能优化功能,加速用户查询,把简单交给用户

前置知识

过滤条件下推

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

1.png

全下推到存储弊端

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

不下推 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列不下推计划是更优的计划。

3.png

可优化场景

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

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

磁盘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变化。可以看到有着十分明显的性能提升。4.png

结语

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

(云数据仓库ADB-开发者群:钉钉群号 23128105)


AnalyticDB MySQL新推出的湖仓版已正式商用,对于低成本离线处理ETL有需求,同时又需要使用高性能在线分析支撑BI报表/交互式查询/APP应用的用户,欢迎购买和体验!

另外对湖仓版感兴趣的客户也可以填写问卷来进行试用申请,点击此处填写问卷。

相关实践学习
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天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
8天前
|
人工智能 数据库 自然语言处理
拥抱Data+AI|DMS+AnalyticDB助力钉钉AI助理,轻松玩转智能问数
「拥抱Data+AI」系列文章由阿里云瑶池数据库推出,基于真实客户案例,展示Data+AI行业解决方案。本文通过钉钉AI助理的实际应用,探讨如何利用阿里云Data+AI解决方案实现智能问数服务,使每个人都能拥有专属数据分析师,显著提升数据查询和分析效率。点击阅读详情。
拥抱Data+AI|DMS+AnalyticDB助力钉钉AI助理,轻松玩转智能问数
|
9天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
38 5
|
1月前
|
人工智能 数据挖掘 数据库
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
本文为数据库「拥抱Data+AI」系列连载第1篇,该系列是阿里云瑶池数据库面向各行业Data+AI应用场景,基于真实客户案例&最佳实践,展示Data+AI行业解决方案的连载文章。本篇内容针对电商行业痛点,将深入探讨如何利用数据与AI技术以及数据分析方法论,为电商行业注入新的活力与效能。
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
|
21天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
27天前
|
人工智能 自然语言处理 关系型数据库
客户说|宝宝树选用AnalyticDB RAG引擎,共创智能母婴生活新范式
宝宝树与阿里云深度合作,利用大数据和AI技术,推出了一系列智能化产品,如AI解读B超单、AI起名等,覆盖备孕、孕期、产后等场景,提升了用户体验,推动了商业化进程。通过技术架构的优化,宝宝树在内容生产和搜索精度上取得了显著成效,未来将继续深化“AI+母婴”战略,为用户提供更全面、个性化的服务。
|
1月前
|
人工智能 数据库 决策智能
拥抱Data+AI|如何破解电商7大挑战?DMS+AnalyticDB助力企业智能决策
本文为阿里云瑶池数据库「拥抱Data+AI」系列连载第1篇,聚焦电商行业痛点,探讨如何利用数据与AI技术及分析方法论,为电商注入新活力与效能。文中详细介绍了阿里云Data+AI解决方案,涵盖Zero-ETL、实时在线分析、混合负载资源隔离、长周期数据归档等关键技术,帮助企业应对数据在线重刷、实时分析、成本优化等挑战,实现智能化转型。
拥抱Data+AI|如何破解电商7大挑战?DMS+AnalyticDB助力企业智能决策
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
114 1
MySQL主从复制原理和使用
|
2月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
83 5
Mysql(3)—数据库相关概念及工作原理
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1704 14

相关产品

  • 云原生数据仓库AnalyticDB MySQL版