SQL优化三步曲
有一天开发同学反馈线上业务库中有一条SQL执行很满,每次几乎要跑1分钟才结束,希望我们帮忙优化一下,具体SQL如下:
SQL优化第一步 - 查看执行计划
对于一个SQL的优化,我们的第一步也是最重要的一步就是查看SQL执行计划,SQL执行计划一方面告诉我们SQL具体的处理行为,另外一方面也可以体现每个执行步骤下大致的资源消耗点。所以我们拿到问题SQL以及对应数据库环境后,登录该环境只读实例进行SQL分析测试。
从以上的SQL执行计划我们可以获取到哪些有效信息呢?
- SQL先对t表扫描查询生产派生表,brand通过索引过滤作为表关联的驱动表,与vender、product、shop_product、spu、进行关联查询,表关联均有效利用索引。
- 从type字段上看,SQL基本上都有效利用到了索引,但是index其实是全索引扫描,该方式的索引扫描执行效率并不会很好
- 对t表的index全索引扫描数据量高达480w,在当前SQL中执行消耗最大,这也将是我们SQL优化的切入点
- t表在源SQL中并未出现,再次仔细观察SQL可以发现SQL引用了view_prod_store_sum的视图
SQL优化第二步 -
在MySQL中对于视图使用我们需要知道的是虽然MySQL对视图的查询做了一些优化,但是对于复杂视图查询其优化支持仍然不是很好,所以业务上我们要尽量避免对复杂视图的使用。在本SQL中视图其实是对单表的查询,且目前SQL资源消耗的瓶颈点也在视图查询这部分,所以我们将视图的定义通过子查询代替原视图,整体的来看SQL。
视图定义:
完整SQL:
SQL优化第三步 - 适当改写
结合我们获取到的SQL执行计划以及恢复出来的完整SQL,我们再次理解当前SQL的处理行为:
1)对t表进行全索引扫描,生产派生表2
2)brand表通过brand_id IN (252)条件进行索引过滤,后续与其他表以及派生表2进行关联查询
- 资源消耗点分析:
从SQL真正需要查询的数据来看,我们只需要先通过where子句中表过滤条件过滤获取初步满足条件记录,然后对这些记录判断 sum(store) > 0是否满足,满足则返回。但是该SQL实际处理却是先将t表中所有记录的store进行分组计算,将结果保存在派生表中。通过where子句中表过滤条件后的记录再与派生表关联判断sum(store)。
SQL在处理的过程似乎扫描了很多不必要的数据,我们为何不仅仅对已满足where子句条件过滤的记录做sum(store)判断呢?
基于以上的分析,我们尝试使用exists相关子查询进行改写测试。为什么使用相关子查询呢,这是因为exists在处理SQL时的核心思想是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断。 因此我们可以有效的利用exists避免的避免掉优先对t表的派生表产生,保证SQL优先通过where子句中选择性最佳的条件做驱动表,然后对sum(store)通过相关子查询进行判断。
- 具体改写如下:
- 改写后的执行计划:
- 执行效率对比
优化前:
优化后:
在一般业务SQL编写中,我们都推荐开发同学使用join而不是exists,这是因为exists本身处理SQL的方式下如果where条件处理后外表记录仍然很大的情况下,再次将外表中每条记录代入exists子查询中判断,其资源消耗代价是很大的。所以我们更偏向使用JOIN,在满足必要的索引情况下MySQL优化器优先选择小表进行驱动。无论具体选择什么方式,其实减少扫描函数才是王道!
更多技术文章,关注公众号“云掣YUNCHE”,还有更多行业咨询哦。
SQL优化三步曲的更多相关文章
- SQL Server2005 表分区三步曲(zz)
前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- 素数问题三步曲_HDOJ2098
偶然间OJ上敲到一题素数问题便查询了相关算法.对于该类问题我个人学习分为三步曲:最笨的方法(TLE毫无疑问)->Eratosthrnes筛选法->欧拉线性筛选法 针对HDOJ2098这道题 ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- [转]Membership三步曲之入门篇 - Membership基础示例
本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例 Members ...
- 第七章 new的三步曲
这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...
- ASP.NET 安全系列 Membership三步曲之入门篇 - Jesse Liu
Membership 三步曲 ASP.NET 安全系列 Membership三步曲之入门篇 ASP.NET 安全系列 Membership三步曲之进阶篇 ASP.NET 安全系列 Membership ...
- OpenGL ES2.0编程三步曲 -转
原地址:http://blog.csdn.net/myarrow/article/details/7707943 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. typedef st ...
- VC控件自绘制三步曲
http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
随机推荐
- Solution Set -「ABC 196」
「ABC 196A」Difference Max Link. 略. #include<cstdio> long long a,b,c,d; int main(){ scanf(" ...
- strcpy()函数详解
strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src);char ...
- Go语言常用标准库——flag
文章目录 os.Args flag包基本使用 导入flag包 flag参数类型 定义命令行flag参数 flag.Type() flag.TypeVar() flag.Parse() flag其他函数 ...
- ndk开发之native层访问java层
一.native层访问java层的成员变量 java层的成员变量可以分为实例变量和静态变量,不过他们的访问方法比较类似,可以分为以下三步: 获取java类对应的jclass对象 获取需要访问的成员变量 ...
- 【PHP正则表达式】
[PHP正则表达式] 最近写题总是遇到php正则表达式的匹配函数,于是进行一个总结. 1.什么是正则表达式 是php在进行搜索时用于匹配的模式字符串.一般用于php对特定字符序列的替换和搜索. 2.正 ...
- Frog 3 题解
Frog 3 题目大意 题意都这么明确了还要这个干什么. 存在 \(n\) 个点,每个点有一个属性 \(h_i\),\(h_i\) 单增,从点 \(i\) 移动到点 \(j(j>i)\) 的代价 ...
- 安装 Android x86 并开启 arm 兼容
安装 Android x86 并开启 arm 兼容 Win 11 下开启了 Hyper-v,尝试了各种安卓模拟器,要么不能设置代理(BlueStacks),要么/system目录没办法设置. 获取 A ...
- flyod
最开始看错数据了没看到Q = 100 是50%的数据以为跑q遍floyd能过,结果只有30,其他全t 1.要注意题目中的条件,挖掘一些性质 var code = "92ce4972-7e0f ...
- eNSP小实验——配置路由器与主机
练习一 在eNSP里配置路由器与主机,IP地址与端口 配置PC1 配置PC2,特别注意IP地址与网关 配置路由器一 <Huawei>sys[Huawei]int g0/0/0 [Huawe ...
- 线程的查看方式&运行原理
观察多个线程同时运行 主要是理解 交替执行 谁先谁后,不由我们控制 查看进程线程的方法 windows 任务管理器可以查看进程和线程数,也可以用来杀死进程 tasklist 查看进程 taskkill ...