MySQL 记一个调优记录:最大化获取 uid 和 mobile

news2024/9/28 17:28:57

目录

  • 前言
  • 调优过程
  • 总结

前言

环境:MySQL 5.6、windows 11

前阵子,有一个 BI 看板跑不起来,每次执行跑了很久,还不一定有结果,急需维护迭代。

经过调试,发现看板的SQL 逻辑中有一个开销非常大的逻辑影响了整个 SQL 的逻辑。
抽象出来讲就是,有两个表暂且叫t1t2吧,两个表都有用户的两个标识,一个是uid,另一个是mobilet1表中的uidmobile字段都有可能是空字符串,但至少有一个值;而t2表都有uid,但是mobile字段可能为空字符串。

现在的目的就是将两个表进行关联,最大化的获取到uidmobile的值,以保证数据的准确性和完整性。

补充说明:t1表的数据量是万级别,mobile='' 大约一两百个;而t2表的数据量是千万级别,70% 的mobile为空。两个表的相关字段都有索引。

原先的逻辑大致如下:

-- sql1:
SELECT IF(t1.uid='',t2.uid,t1.mobile) uid,IF(t1.mobile='',t2.mobile,t1.mobile) mob
FROM t1
LEFT JOIN t2 ON (t1.uid !='' AND t1.uid=t2.uid) or (t1.mobile !='' AND t1.mobile=t2.mobile)
limit 200;

通过LEFT JOIN进行关联,关联条件使用了OR进行连接,每一个独立的条件里分别还有一个AND判断。

执行策略简化之后大致如下(局部调整):
在这里插入图片描述

执行计划是树状结构,顺序是从下往上看,先是第 8 步,操作策略是TableScan,即全表扫描,数据量是1.0E7。然后第 7 步进行Exchange[REPLICATE],即数据交换操作,将从上一个步骤的单个执行线程复制到多个执行线程,数据量也是1.0E7。可以看到后面是会有一些发散,由 1.0E7 增加到 1.1E7。而且LEFT JOIN的行数也是大表的数据,而非小表。


由于执行计划是树状结构,仅看到了执行的顺序、操作和数据量,没有像 MySQL 默认的表格形式般展示执行策略。所以更多的是通过执行的时间进一步辅助判断性能。

该逻辑跑了几次没有跑出结果,每次等待了30多秒,最终放弃了。直接改!

调优过程

众所周知,OR是一个相对较慢的查询优化方案,所以为了保证查询效率,首先要把OR优化掉,尝试使用LEFT JOIN来优化。
故分别单独关联一个条件,然后执行查询,观察最终的效果。结果每个任务的执行速度都提升到了一个层次,几百毫秒的功夫便跑完了!
那么,基于以上的观察,一个初步的、可行的方案就浮现出来了,那就是使用LEFT JOIN的方式,去关联两次t2表,一次使用uid来关联,一次使用mobile来关联。

SELECT t1.uid,t2.mobile FROM t1 LEFT JOIN t2 ON t1.uid=t2.uid AND t1.uid<>'' limit 200;
SELECT t2.uid,t1.mobile FROM t1 LEFT JOIN t2 ON t1.mobile=t2.mobile AND t1.mobile<>'' limit 200;

最终的结果如下:

-- sql2:
SELECT IF(t1.uid='',t2_2.mobile,t1.mobile) uid,IF(t1.mobile='',t2.uid,t1.uid) mob
FROM t1
LEFT JOIN t2 ON t1.uid=t2.uid
LEFT JOIN t2 t2_2 ON t1.mobile=t2_2.mobile AND t2.uid IS NULL

简单分析下:

  • 先看关联逻辑,都是使用LEFT JOIN,优先采用关联t1.uid,再关联t1.mobile
    • 第一个LEFT JOIN由于t1.uid90% 不为空,所以直接关联,把分步测试的t1.uid<>''限制条件去掉,减少一次较低效判断的开销。
    • 第二个LEFT JOIN同理,把t1.mobile<>''去掉了,但是加了另外一个条件AND t2.uid IS NULL,将匹配的数据量降低到原来的 10%(10% 有mobileuid)。
  • 关于SELECT有一个容易绕的逻辑,就是通过t1.uid匹配上的则取t2.mobile,通过t1.mobile匹配上的则取t2.uid,如果绕不过来,可以细品一下。


最终跑了很多次,执行时间是几百毫秒到1秒,不等,会受到网络波动和资源调配的影响,不过基本就是不超过 1 秒。

总结

其实,调优通常要考虑到运行环境,包括网络速度、系统配置等多种影响因素;除了环境之外,运行时长也十分关键,运行时间太长往往意味着资源的开销会更多;此外,理解表单逻辑,把握数据表单之间的联系,也需要重点关注,这有助于我们更好地解决问题。

因此,调优的过程中,我们需要结合以上诸多因素进行综合判断,关键在于灵活运用,学以致用,以期达到更佳的效果。

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

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

相关文章

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

AI会取代程序员吗?这几个事实告诉你真相

人工智能&#xff08;AI&#xff09;的迅猛发展引起了许多关于其对各行各业的影响的讨论&#xff0c;其中包括程序员的未来。有人认为&#xff0c;AI的出现可能会使程序员岗位面临消失的风险&#xff0c;因为它们可以自动化编码和解决问题的过程。然而&#xff0c;在我们下结论…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式&#xff1a;三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01; 也许一个人独行&#xff0c;可以走的很快…

全志V3S嵌入式驱动开发(full image制作和资料汇总)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的full image制作&#xff0c;就是制作一个image&#xff0c;上面包含了所有的嵌入式软件、库和配置文件。之前虽然我们也构建了spi-nor、spi-…

AC/DC(二): 整流

一、全波整流电路 全波整流电路可以看作是由两个半波整流电路组合而成&#xff0c;如图1所示&#xff0c; 图1 变压器次级线圈中间引出一个中心抽头&#xff0c;把次级线圈分成两个对称的绕组&#xff0c;从而引出大小相等但极性相反的两个电压VD1、VD2&#xff0c;构成VD1、…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。 1 设计思路 首先&#xff0c;我来说明一下设计思路。我们先来看看目前OSGi.NET插件…

C++中生成二维码-libqrencode

文章目录 前言libqrencode在qt中调用libqrencode其他 前言 二维码的种类很多。本文仅介绍&#xff0c;如何用C生成QR码(QRcode)。通常而言&#xff0c;我们不需要知道QR码的详细结构&#xff0c;如QrCode的结构原理与实战 | 张展鹏的博客。我们只需要&#xff0c;可以将文本转…

Python——— 字符串

&#xff08;一&#xff09;字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。顾名思义&#xff0c;羊肉串是由羊肉做成的串&#xff0c;而字符串就是由字符组成的。 字符串的本质是&#xff1a;字符序列。 2 Python 不支持单字符…

Kafka 小结

Kafka 是由 Linkedin 开发并开源的分布式消息系统&#xff0c;因其分布式及高吞吐率而被广泛使用&#xff0c;现已与 Cloudera Hadoop、Apache Storm、Apache Spark、Flink 集成。 Kafka 使用场景 页面访问量 PV、页面曝光 Expose、页面点击 Click 等行为事件&#xff1b;实时计…

低分辨率图像中目标检测(附论文下载)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2201.02314.pdf 计算机视觉研究院专栏 作者&#xff1a;Edison_G 超分辨率&#xff08;SR&#xff09;等…

【Openvino03】深入了解OpenVINO™ 工具包与Jupyter Notebooks工程

接上一篇&#xff0c;本篇将以OpenVINO™ 工具包、Jupyter Notebook工具以及OpenVINO™ Notebooks工程为基础&#xff0c;依照构建环境、工具学习、案例学习、实战部署的顺序引导初学者完成从0到1学习人工智能的全过程&#xff0c;希望众多对人工智能感兴趣的开发者&#xff0c…

【多维BFS】ABC308 D

VP的时候居然花了半小时&#xff01; 可恶&#xff01; D - Snuke Maze (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;我们发现到达一个格子之后&#xff0c;下一个格子的字符是确定的 但是&#xff0c;下一个格子到底是哪个是不确定的 下一个格子不…

FreeRTOS源码解析——第一章 整体架构

FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时器 第七章 FreeRTOS 信号量 第八章 FreeRTOS 互斥量 第九章 FreeRTOS 任务通知 第十章 FreeRTOS…

算法习题之宏观分层问题

宏观分层 习题1 给定一个正方形矩阵matrix&#xff0c;原地调整成顺时针90度转动的样子习题2 给定一个长方形矩阵matrix&#xff0c;实现转圈打印习题3 给定一个正方形或者长方形矩阵matrix&#xff0c;实现zigzag打印习题4 输入N,在控制台上输出初始边长为N的图案 习题1 给定一…

U盘数据丢失是什么原因?轻松让U盘数据恢复的教程

在数字化时代&#xff0c;我们不可避免地使用各种便携式存储设备&#xff0c;如U盘&#xff0c;来传输和存储重要数据。然而&#xff0c;有时我们可能不小心删除了U盘中的文件&#xff0c;或者格式化了U盘等等而导致数据丢失。这种情况下&#xff0c;你可能会困惑地想知道&…

机器学习——基于Tensorflow和Keras实现卷积神经网络CNN——猫狗分类

文章目录 环境的配置神经网络CNN的介绍卷积前馈神经网络卷积神经网络应用邻域 数据集准备数据预处理构建基准模型 总结什么是过拟合&#xff08;overfit&#xff09;&#xff1f;什么是数据增强&#xff1f;单独制作数据增强&#xff0c;精确率提高了多少&#xff1f; 然后再添…

硬件大熊原创合集(2023/06更新)

06月份更新篇章&#xff1a; 一款射频芯片的layout设计指导案例-篇章1 一款射频芯片的layout设计指导案例-篇章2 警惕超声波工艺对晶振造成损伤 走嵌入式方向&#xff0c;一定要软硬件都懂吗&#xff1f; 6月份广州光亚展&#xff0c;和电子电力大咖文老师见了个面&#xff0c;…

2023车载摄像头9大热点趋势

摘要&#xff1a; 相较于消费类电子摄像头&#xff0c;车载摄像头的工作环境极度恶劣&#xff0c;比如说震动、高温、雨雾、低温、光线变化剧烈等。而车载摄像头以驾驶安全为目的&#xff0c;上述各个工作状态下&#xff0c;均需要能获取稳定、可靠、清晰的周边环境数据。 近年…

HOT36-二叉树的中序遍历

leetcode原题链接&#xff1a;二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a…