首页 > 数据库 >GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!

时间:2024-01-29 12:02:16浏览次数:34  
标签:剪枝 多表 DISTINCT GaussDB 70 扫描 MySQL

作者,祝青平,华为云数据库内核高级工程师。

擅长数据库优化器内核研发,9年数据库内核研发经验,参与多个TP以及AP数据库的研发工作。

近日,华为云数据库社区下面有这样一条用户提问留言:请问,如何通过MySQL提升DISTINCT,尤其是多表连接下DISTINCT的查询效率?

在回答这个问题之前,我们先了解一下DISTINCT。

在SQL语句中,DISTINCT关键词用于返回唯一不同的值,使用场景多,应用频繁。它可以用于做单列数据去重,例如,对公司雇员按照”first_name”去重后,得到1275条记录。

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_表连接

也可以做多列去重,即只有所有指定列的信息都相同时,才会被认为是重复的信息,例如,对公司雇员按照”first_name”和”gender”两列去重后得到2550条记录。

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_MySQL_02

对于“多表连接+DISTINCT”场景,MySQL 8.0需要扫描表连接后的结果。当表连接数量多或基表数据量大时,扫描的数据量也会很大,会导致执行效率很低。如下示例,对7个表连接后的结果做DISTINCT,使用MySQL 8.0.30社区版本,执行耗时186秒,通过查看慢日志信息,发现扫描了约4400万行数据。

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_执行效率_03

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_MySQL_04

为了提升DISTINCT,尤其多表连接下DISTINCT的查询效率,GaussDB(for MySQL)在执行优化器中加入了剪枝功能,可以去除不必要的扫描分支,节省查询耗时。

GaussDB(for MySQL)剪枝方案

以下面的SQL执行为例,表t1有4行数据1,2,5,6。执行如下多表连接+DISTINCT:

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_05

表连接执行逻辑如下:

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_06

上述例子中,在MySQL 8.0.30社区版本执行器需要扫描60行数据才能获得结果集。找到满足条件的唯一结果{i=1,j=2,k=5}后,不会停止本轮扫描,而是继续扫描{i=1,j=5,k=1}及后续无用的数据,导致执行时间长。详细的执行流程参见下图:

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_07

针对如上的多表连接+DISTINCT执行效率慢的问题,GaussDB(for MySQL)在火山模型的执行器上实现了提前减枝优化,当找到满足的条件的DISTINCT值之后,通过全局变量判断是否可以提前结束本轮迭代,并层层退出,大幅减少了扫描工作量。

以上述SQL为例,在扫描{1,1,1},{1,1,2},{1,1,5},{1,1,8},{1,2,1},{1,2,2},{1,2,5} 7组数据后,找到满足DISTINCT 条件值 tt1.a "1",立即结束本轮迭代,并停止上一层迭代。该例子中只需要扫描28行数据就可获得最终结果集,相比MySQL 8.0社区版本扫描60行,GaussDB(for MySQL)性能显著提升。

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_08

GaussDB(for MySQL)剪枝特性使用方法

打开特性开关:SET rds_nlj_distinct_optimize=ON;

通过”EXPLAIN FORMAT=TREE”查看特性是否生效,执行计划中出现” join with distinct optimization”关键字说明特性生效,查询过程中可进行减枝优化,提升多表JOIN+DISTINCT执行效率。

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_DISTINCT_09

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_执行效率_10

GaussDB(for MySQL)剪枝典型场景测试对比

前面提到的测试样例中,GaussDB(for MySQL)执行耗时2.7秒完成,只需要扫描数据量约61万行;相比MySQL 8.0 社区版本执行耗时约186秒,扫描数据量4400万,执行耗时和扫描数据量减少近70倍,实现了执行效率飞跃式提升。如下图所示:

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_11

GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!_SQL语句_12

因此,针对“多表连接+DISTINCT”的场景,GaussDB(for MySQL)在执行过程中动态剪枝,裁剪掉大量无用数据,减少执行过程中扫描数据量,是提升查询效率的秘密武器。

总结:

以上通过对GaussDB(for MySQL)剪枝方案、剪枝特性使用方法、典型场景测试对比结果的详细呈现,剖析了“多表连接+DISTINCT”场景中,GaussDB(for MySQL)大幅提升查询效率的原因。如果对华为云GaussDB(for MySQL)更多功能感兴趣的话,可以查看官方产品文档,了解更多:https://support.huaweicloud.com/gaussdbformysql/index.html

点击关注,第一时间了解华为云新鲜技术~

标签:剪枝,多表,DISTINCT,GaussDB,70,扫描,MySQL
From: https://blog.51cto.com/u_15214399/9462388

相关文章

  • Gym104270E Kawa Exam
    题意简述有\(n\)道题,每道题有\(10^5\)个选项,其中选项\(a_i\)是正确的。再给定\(m\)条限制\(u_i,v_i\),表示题目\(u_i,v_i\)必须要选择相同的选项。对于\(m\)条限制,求出若去掉这条限制,最多能回答多少问题。多组数据。\(n,m,a_i\le10^5,\sumn,\summ\le10^6\)。......
  • CF1070H 题解
    思路我们第一眼看题就发现每个字符串的长度在只有\(8\)。我们需要判断的是某个字符串是不是前面字符串的子串,因为长度太小,所以可以把字符串的每一个子串放到map里,再用一个map判断一个子串是否在当前字符串出现过,出现过就不能重复记。最后在用一个map记录一下每个子串对应......
  • hihocoder#1707 麻烦的第K大问题
    由区间第\(x\timesy\)大又到多重集第\(k\)大从普通的元素到我们要求的\(ans\)之间是有大小关系的(在区间内\(<-->\)区间第\(x\timesy\)大\(<-->\)多重集内第\(k\)大)再加上二分时产生的单调性:此时设二分的值为\(mid\),标记数组为\(b[]\)\[b_i=\begin{cases}......
  • 影驰RTX 4070 SUPER星曜OC显卡评测:250W超频潜力十足 散热更惊喜
    一、前言:影驰推出主打高颜值的RTX4070SUPER星曜OC显卡影驰作为DIY大厂,要说它家颜值最高的产品,那必然就是星曜系列,无论显卡、内存还是SSD,不光好看,品质和性能上也都有着不俗的表现。随着RTX4070SUPER的推出,影驰也第一时间推出了这款主打高颜值的RTX4070SUPER星曜OC显卡。......
  • windowForm程序的webView2错误 System.IO.FileNotFoundException: 系统找不到指定的文
    最近开发公司的一个项目,要求打包在windows中执行的exe可执行文件开始我想到的是使用windowsForm里面webView嵌套网页执行,vs自带提供的WebBrowser的内核是ie7的,兼容性确实不好,后面使用Microsoft.Web.WebView2(通过NuGet安装)兼容性问题解决了。在我的电脑上可以完整的运行,但是在同......
  • 初中英语优秀范文100篇-070A Job I Want to Do in the Future-我未来想做的工作
    PDF格式公众号回复关键字:SHCZFW070记忆树1Everyonehashisdreamjob.SodoI.翻译每个人都有他的理想工作。我也一样。简化记忆工作句子结构主语:Everyone(每个人)谓语:has(有)宾语:hisdreamjob(他的理想工作)SodoI是一个倒装句,表示"Ialsohavemydreamjob",其......
  • [ARC170C] Prefix Mex Sequence
    给定\(n,m,S_1\simS_n\),当\(S_i=0\)时\(A_i\neq\mathrm{mex}(A_1\simA_{i-1})\),反之\(A_i=\mathrm{mex}(A_1\simA_{i-1})\),求值域为\([0,m]\)的\(A\)的数量\(\bmod\998244353\)。\(1\len\le5000,0\lem\le10^9\)。看到题目就会想到......
  • 代码随想录算法训练营第三天| 203.移除链表元素,707.设计链表 ,206.反转链表
    203.移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。题目链接:203.移除链表元素-力扣(LeetCode)注意c++中NULL和nullptr的区别。应该用nullptr来表示空指针。/***Definitionforsingly......
  • 江苏银行联合华为云GaussDB进行核心系统改造
    本文分享自华为云社区《江苏银行联合华为云GaussDB进行核心系统改造》,作者:华为云头条。金融行业自主创新关乎金融安全大局。近年来,随着《金融科技发展规划(2022—2025年)》等相关政策的出台,金融行业核心技术自主创新逐步迈向“深水区”,正在从外围应用深入到核心业务系统,分布式数据库......
  • 江苏银行联合华为云GaussDB进行核心系统改造
    本文分享自华为云社区《江苏银行联合华为云GaussDB进行核心系统改造》,作者:华为云头条。金融行业自主创新关乎金融安全大局。近年来,随着《金融科技发展规划(2022—2025年)》等相关政策的出台,金融行业核心技术自主创新逐步迈向“深水区”,正在从外围应用深入到核心业务系统,分布式数据......