一次显著的性能提升,从8s到0.7s

前言

最近我在公司优化了一些慢查询SQL,积累了一些SQL调优的实战经验。

我之前写过一些SQL优化相关的文章《聊聊SQL优化的15个小技巧》和《explain | 索引优化的这把绝世好剑,你真的会用吗?》,在全网广受好评。

这篇文章从实战的角度出发,给大家分享一下如何做SQL调优。

经过两次优化之后,慢SQL的性能显著提升了,耗时从8s优化到了0.7s

现在拿出来给大家分享一下,希望对你会有所帮助。

1 案发现场

前几天,我收到了一封报警邮件,提示有一条慢查询SQL。

我打开邮件查看了详情,那条SQL大概是这样的:

SELECT count(*)
FROM spu s1
WHERE EXISTS (SELECT *FROM sku s2INNER JOIN mall_sku s3 ON s3.sku_id = s2.idWHERE s2.spu_id = s1.idAND s2.status = 1AND NOT EXISTS (SELECT *FROM supplier_sku s4WHERE s4.mall_sku_id = s3.idAND s4.supplier_id = 123456789AND s4.status = 1)
)

这条SQL的含义是统计id=123456789的供应商,未发布的spu数量是多少。

这条SQL的耗时竟然达标了8s,必须要做优化了。

我首先使用explain关键字查询该SQL的执行计划,发现spu表走了type类型的索引,而sku、mall_sku、supplier_sku表都走了ref类型的索引。

也就是说,这4张表都走了索引

不是简单的增加索引,就能解决的事情。

那么,接下来该如何优化呢?

2 第一次优化

这条SQL语句,其中两个exists关键字引起了我的注意。

一个exists是为了查询存在某些满足条件的商品,另一个not exists是为了查询出不存在某些商品。

这个SQL是另外一位已离职的同事写的。

不清楚spu表和sku表为什么不用join,而用了exists。

我猜测可能是为了只返回spu表的数据,做的一种处理。如果join了sku表,则可能会查出重复的数据,需要做去重处理。

从目前看,这种写性能有瓶颈。

因此,我做出了第一次优化。

使用join + group by组合,将sql优化如下:

SELECT count(*) FROM
(select s2.spu_id from spu s1inner join from sku s2inner join mall_sku s3 on s3.sku_id=s2.idwhere s2.spu_id=s1.id and s2.status=1and not exists (select * from supplier_sku s4where s4.mall_sku_id=s3.idand s4.supplier_id=...)group by s2.spu_id
) a

文章中有些相同的条件省略了,由于spu_id在sku表中是增加了索引的,因此group by的性能其实是挺快的。

这样优化之后,sql的执行时间变成了2.5s

性能提升了3倍多,但是还是不够快,还需要做进一步优化。

3 第二次优化

还有一个not exists可以优化一下。

如果是小表驱动大表的时候,使用not exists确实可以提升性能。

但如果是大表驱动小表的时候,使用not exists可能有点弄巧成拙。

这里exists右边的sql的含义是查询某供应商的商品数据,而目前我们平台一个供应商的商品并不多。

于是,我将not exists改成了not in。

sql优化如下:

SELECT count(*) FROM
(select s2.spu_id from spu s1inner join from sku s2inner join mall_sku s3 on s3.sku_id=s2.idwhere s2.spu_id=s1.id and s2.status=1and s3.id not IN (select s4.mall_sku_id from supplier_sku s4where s4.mall_sku_id=s3.idand s4.supplier_id=...)group by s2.spu_id
) a

这样优化之后,该sql的执行时间下降到了0.7s。

之后,我再用explain关键字查询该SQL的执行计划。

发现spu表走了全表扫描,sku表走了eq_ref类型的索引,而mall_sku和supplier_sku表走了ref类型的索引。

可以看出,有时候sql语句走了4个索引,性能未必比走了3个索引好。

多张表join的时候,其中一张表走了全表扫描,说不定整个SQL语句的性能会更好,我们一定要多测试。

说实话,SQL调优是一个比较复杂的问题,需要考虑的因素有很多,有可能需要多次优化才能满足要求。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:面试、代码神器、开发手册、时间管理有超赞的粉丝福利,另外回复:加群,可以跟很多BAT大厂的前辈交流和学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库连接,TNS描述符与连接字符串

前言:在现代应用程序开发中,与数据库建立可靠、高效的连接是至关重要的一环。在Oracle数据库中,Transparent Network Substrate(TNS)提供了一种强大的网络服务,使得客户端能够通过逻辑服务名连接到数据库&a…

Intellij IDEA 的安装和使用以及配置

IDE有很多种,常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA(以下简称IDEA),被众多Java程序员视为最好用的Java集成开发环境,今天的主题就是IDEA为开发工…

linux服务器防火墙知识学习

# 查看rich-rules 查看所有防火墙已注册的规则 [roothcss-ecs-8b3c ~]# firewall-cmd --list-rich-rules rule family"ipv4" source address"xxx.xxx.xx.xx" accept# 每次设定完规则相关后&#xff0c;都需要<reload>防火墙 [roothcss-ecs-8b3c ~]…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…

系列十七、各种各样的bean

一、Spring bean 1.1、概述 一句话&#xff0c;被Spring容器管理的bean就是Spring bean。 二、Java bean VS Spring bean 2.1、概述 Java bean是程序员自己new 出来的&#xff0c;Spring bean是Spring工厂创建出来的。 三、配置bean的方式 3.1、概述 所谓配置bean&#xff0…

jetson nano SSH远程连接(使用MobaXterm)

文章目录 SSH远程连接1.SSH介绍2.准备工作3.连接步骤3.1 IP查询3.2 新建会话和连接 SSH远程连接 本节课的实现&#xff0c;需要将Jetson Nano和电脑保持在同一个局域网内&#xff0c;也就是连接同一个路 由器&#xff0c;通过SSH的方式来实现远程登陆。 1.SSH介绍 SSH是一种网…

魔珐科技:3D虚拟人AIGC原生产品,助力全新商业机遇

11月28日-29日&#xff0c;WISE2023 商业之王大会在北京国际会议中心成功举办。此次大会以“太阳照常升起&#xff08;The Sun Always Rises&#xff09;”为主题&#xff0c;活动汇聚了全商业领域知名企业&#xff0c;围绕前沿趋势&#xff0c;共话商业创新之策。 在本次论坛…

Python 字典深度解析:键值对的妙用与高级操作

字典&#xff08;Dictionary&#xff09;是Python中一种强大的数据结构&#xff0c;以键值对&#xff08;key-value pairs&#xff09;的形式存储数据。深入理解字典的基本操作以及高级应用&#xff0c;将使你更好地利用这一灵活而高效的工具。 基本概念 字典是无序、可变的数…

员工随意安装软件有什么危害?企业该如何管理?

现代企业中&#xff0c;员工使用电脑办公已经是常态&#xff0c;但总会有员工私自安装软件。员工随意安装软件有什么危害&#xff1f;企业该如何管理&#xff1f; 1. 恶意软件感染&#xff1a;不安全的软件可能包含病毒、木马、蠕虫等恶意软件&#xff0c;如果用户安装了这些软…

OSEK OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

python-列表与字典的异同

Python中的列表&#xff08;List&#xff09;和字典&#xff08;Dictionary&#xff09;是两种不同类型的数据结构&#xff0c;它们在用途和特性上有一些重要的异同。 相同点&#xff1a; 可变性&#xff1a; 列表和字典都是可变的数据结构&#xff0c;可以在创建后修改其内容…

网络套接字

目录 UDP 套接字 理解源IP地址和目的IP地址 端口号 源端口号和目的端口号&#xff08;port&#xff09; TCP UDP 网络字节序 socket程序接口 UDP套接字编写 服务器编写 服务器类结构 构造函数 启动服务 主函数 客户端编写 UDP 套接字 理解源IP地址和目的IP地址…

开关电源基础而又硬核的知识

1.什么是Power Supply? Power Supply是一种提供电力能源的设备&#xff0c;它可以将一种电力能源形式转换成另外一种电力能源形式&#xff0c;并能对其进行控制和调节。 根据转换的形式分类&#xff1a;AC/DC、DC/DC、DC/AC、AC/AC 根据转换的方法分类&#xff1a;线性电源、…

Qt-QSplitter正确设置比例

简短版本&#xff1a; splitter->setSizes({1000, 2000}); // 这个值至少跟像素值设置的一样大&#xff0c;或者更大&#xff0c;例如x10倍详细版本&#xff1a; setSizes 官方介绍如下&#xff1a; Sets the child widgets’ respective sizes to the values given in the…

使用JMeter安装RabbitMQ测试插件的步骤

整体流程如下&#xff1a;先下载AMQP插件源码&#xff0c;可以通过antivy在本地编译成jar包&#xff0c;再将jar包导入JMeter目录下&#xff0c;重启JMeter生效。 Apache Ant 是一个基于 Java 的构建工具。Ant 可用于自动化构建和部署 Java 应用程序&#xff0c;使开发人员更轻…

Locust单机多核压测,以及主从节点的数据通信处理!

一、背景 这还是2个月前做的一次接口性能测试&#xff0c;关于locust脚本的单机多核运行&#xff0c;以及主从节点之间的数据通信。 先简单交代下背景&#xff0c;在APP上线之前&#xff0c;需要对登录接口进行性能测试。经过评估&#xff0c;我还是优先选择了locust来进行脚…

如何使用内网穿透实现无公网ip环境访问VScode远程开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

msvcp140.dll的解决方法有哪些。详细解析五种可以修复msvcp140.dll丢失的方法

引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。那么&#xff0c;什么是msvcp140.dll文件&#xff1f;它的作用是什么&#xff1f;当它丢失时会对电脑产生什么影响&#xff1f;本文将详细介绍…

软件测试jmeter基本使用

1安装与配置 1.jdk下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk18-windows&#xff08;压缩包中会给&#xff09; 2.jmeter下载 Apache JMeter - Download Apache JMeter&#xff08;压缩包中有&#xff09; 3.操作教学 打开软件后新…

jbrowse基因组浏览器部署

1 ca文件处理 samtools工具安装 wget https://github.com/samtools/samtools/releases/download/1.9/samtools-1.9.tar.bz2tar -jxvf samtools-1.9.tar.bz2 cd samtools-1.9/./configure --prefix/usr/local/samtoolssamtools faidx zdd0006.genome.v1.fa #生成ca文件的索引 执…