又是一条慢 SQL 改写,拿捏!

news2024/11/25 0:20:23

作者分享了一条慢 SQL 分析和优化的过程,总结出切实有效的优化手段。

作者:马文斌

MySQL 爱好者。

本文来源:原创投稿

  • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

背景

开发同学丢了一条 SQL 过来。“马哥,看看这个 SQL 能否优化,业务那边反馈很慢!”看了下执行计划+表结构,索引都没问题。那到底是怎么回事呢?咱们一起来瞧瞧。

分析原 SQL

explain SELECT
        count(0)
FROM
        invoice_sales_application a
WHERE
        (
                shop_order_id LIKE '23060919546335%'
                OR (
                        EXISTS (
                                SELECT
                                        1
                                FROM
                                        invoice_sales_application_detail b
                                WHERE
                                        a.application_no = b.application_no
                                AND a.invoice_category = b.invoice_category
                                AND b.del_flag = 0
                                AND b.shop_order_id LIKE '23060919546335%'
                        )
                        AND a.is_merge = 1
                )
        )

先来看看这个 SQL 是什么意思:

invoice_sales_application 表中,shop_order_id'23060919546335%'开头,或者存在一个相关的 invoice_sales_application_detail 表中的记录,该记录的 application_noinvoice_categoryinvoice_sales_application 表中的相同,并且 shop_order_id'23060919546335%' 开头,同时 invoice_sales_application 表中的 is_merge 字段为 1

执行计划:all+ref,其中 a 表要扫描 116w 行的数据。

执行计划

执行需要 43s,且有一个全表扫描。

扫描时间

优化操作

EXISTS 转化成 JOIN 的方式

这里是把 EXISTS 改写成 INNER JOIN 通过索引关键关联,应该会有不错的效果,试试看。

SELECT  count(0)
FROM invoice_sales_application a INNER
JOIN invoice_sales_application_detail b
  ON a.application_no = b.application_no
WHERE ( a.shop_order_id LIKE '23060919546335%'
    OR ( b.shop_order_id LIKE '23060919546335%'
    AND a.is_merge = 1 ) )
    AND a.invoice_category = b.invoice_category
    AND b.del_flag = 0

执行效果

这里虽然转化了 INNER JOIN 的方式,执行计划还是 all+ref ,因为用了 OR 导致 a 表没有用上索引,还是用的全表扫描。没关系,咱们再次进行转化。

OR 改成 UNION

 SELECT count(*)
 FROM invoice_sales_application a
 INNER JOIN invoice_sales_application_detail b ON a.application_no = b.application_no
 AND a.invoice_category = b.invoice_category
 AND b.del_flag = 0
 WHERE a.shop_order_id = '23060919546335'
 AND a.del_flag = 0
 UNION
 SELECT count(*)
 FROM invoice_sales_application a
 INNER JOIN invoice_sales_application_detail b ON a.application_no = b.application_no
 AND a.invoice_category = b.invoice_category
 AND b.del_flag = 0
 WHERE b.shop_order_id = '23060919546335'
 AND a.is_merge = 1
 AND a.del_flag = 0;

在看看执行计划,eq_ref+ref+ref+ref。说明已经优化的很好了,起码没有全表扫描。

执行计划

最后看看结果。

执行计划

这样 SQL 执行很快了,查询时间从 42s 降到 18ms,快了几个数量级。

小结

1、当 SQL 的主架构中含有 EXISTS 的时候,可以改成 INNER JOIN 的方式,先看看效果。

2、当条件中有 OR 的时候,可以改成 UNION 试试。

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

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

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

相关文章

苹果M1/M2 Mac正式支持运行Win11

微软与虚拟化软件 Parallels 达成合作,允许在 Apple M1 和 M2 Mac 上的虚拟环境中运行 Windows 11。“Parallels Desktop 版本 18 是一个授权解决方案,用于在其平台上的 Apple M1 和 M2 计算机上的虚拟环境中运行 Arm 版本的 Windows 11 Pro 和 Windows …

算法学习 day23

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代…

【高级程序设计语言C++】初识模板

1. 函数模板1.1函数模板的实例化1.2显示实例化1.3模板参数的匹配原则 2.类模板2.1类模板的定义格式2.2类模板的实例化 1. 函数模板 概念: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函…

字符串模式匹配算法(暴力破解、KMP、BM、Sunday)

目录 暴力破解 KMP 算法 构造 next 数组 KMP代码 BM 算法 Sunday 算法 参考资料 又通过leetcode复习了之前的知识:找出字符串中第一个匹配项的下标 暴力破解 你的面前有两段序列 S 和 T,你需要判断 T 是否可以匹配成为 S 的子串。 你可能会凭肉眼立即得出结…

11万字智慧环卫管理平台综合解决方案2023

导读:原文《11万字智慧环卫管理平台综合解决方案word2023》word(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 目 录 第1章 项目概述 1.1 项目名称 …

Java安全——SSL和HTTPS

Java安全 SSL和HTTPS SSL提供了在TCP套接字之上的对数据进行加密的方法,也是HTTPS协议的基础利用JSSE(java安全套接字扩展包)可以像处理协议一样创建和使用SSL套接字,从而支持HTTPS协议SSL和tcp套接字之间的紧密关系,本身并不是一个加密引擎…

PyTorch预训练和微调:以VGG16为例

文章目录 预训练和微调代码测试结果参考来源 预训练和微调代码 数据集:CIFAR10 CIFAR-10数据集由10类32x32的彩色图片组成,一共包含60000张图片,每一类包含6000图片。其中50000张图片作为训练集,10000张图片作为测试集。数据集介…

16. 替换空格

链接: 链接 题目: 请实现一个函数,把字符串中的每个空格替换成"%20"。 数据范围 0≤0≤ 输入字符串的长度 ≤1000≤1000。 注意输出字符串的长度可能大于 10001000。 样例 输入:"We are happy."输出&#xff…

python简易版的飞机大战(图片资源请自找)

# 引入pygame工具包 import pygame from pygame.locals import * import time import random import sys # 初始化pygame pygame.init() # 创建一个宽480高650的一个画布canvas canvas pygame.display.set_mode((480, 650)) # 加工图片资源 bg pygame.image.load(bg.png)# 背…

Vue3之app.config.globalProperties(定义全局变量)

使用之因 一般我们在vue开发中,常用的功能,接口等等我们都会封装起来,如何每次创建一个组件,想要使用这些封装起来的功能、接口等等都需要先引入,再通过层层调用才可以得到结果,如果我现在一遍需要调用后端…

多旋翼物流无人机节能轨迹规划(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

海外品牌推广:谷歌没收录?这些常见错误你可别犯!

你们是否曾经遇到过这样的情况:你在海外市场努力推广你的品牌,但是发现谷歌搜索结果中竟然找不到你的网站或品牌?别担心,你可能犯了一些常见的错误,让谷歌把你的品牌忽略掉了。让我们来看看这些错误,确保你…

3dsmax图纸怎么加密?

对设计行业来说,公司重要的设计图纸是一个企业非常重要的核心数据是命脉,那么具有如此重要性的3Dmax设计文件怎么才能确保文件的安全,避免竞争对手骗方案或者内部人员有意无意的泄密呢? 相信有很多老板或许都会遇到这样的问题。很…

❤️创意网页:有趣的文字冒险游戏(可以无限拓展)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

图片转pdf怎么在线转?看看这几种在线转方法

图片转pdf怎么在线转?图片转PDF是一个非常常见的需求,因为在很多情况下,我们需要将一些图片文件转换为PDF文件格式,以便于传输、打印或者共享。如果你想在线转换图片为PDF文件,下面就给大家推荐几种简单实用的转换方法…

Hadoop集群运行Spark应用程序

启动Spark集群 先启动hadoop,再启动Spark,具体参考链接 对Linux系统对Spark开发环境配置_Matrix70的博客-CSDN博客 运行Spark安装好以后自带的样例程序SparkPi spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 examples/jars/spark…

路径规划算法:基于蛇优化优化的路径规划算法- 附代码

路径规划算法:基于蛇优化优化的路径规划算法- 附代码 文章目录 路径规划算法:基于蛇优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

嵌入式软件测试笔记10 | 嵌入式软件测试中如何进行安全性分析?

10 | 嵌入式软件测试中如何进行安全性分析? 1 简介2 故障模型及后果分析(FMEA)2.1 三个步骤2.2 带来的结果优势2.3 FMEA分析过程2.3.1 描述系统及其功能2.3.2 识别潜在的故障模式2.3.3 故障模式对功能的影响2.3.4 风险导致后果的原因2.3.5 风…

Prompt本质解密及Evaluation实战与源码解析(三)

9.5 Evaluation for QA源码解析 如图9-4所示,我们看一下LangChain框架对问答评估的(Evaluation for QA)的源代码。 图9- 5 LangChain的evaluation qa目录 在eval_prompt.py文件里面,主要定义了三个类 PromptTemplate,它们都是用于生成题目的模板。 Gavin大咖微信:NLP_Mat…

跨端技术栈综合考察:深入剖析 UniApp、Flutter、Taro 和 React Native 的优势与限制

文章目录 📈UniApp⚡概念⚡优势⚡限制 📈Flutter⚡概念⚡优势⚡限制 📈Taro⚡概念⚡优势⚡限制 📈React Native⚡概念⚡优势⚡限制 📈跨端技术栈对比附录:「简历必备」前后端实战项目(推荐&…