真实业务场景:mysql慢查询优化(从17秒的查询优化到700毫秒)

慢查询业务场景:

原先在我们系统中要统计一些人员的单位 部门信息的数据情况,比如总的男女人数,每个单位下的男女人数等等,然后原来的sql是这样写的  根据一个单位的id 然后对一张表做出多个子查询进行查询,这时候统计记录 由于加载过的数据在mysql缓冲池里面,然后多个子查询也不是很慢,大概是几百毫秒就能统计出数据。

      但是甲方在这个查询的基础上加了一个新需求,因为一个人员可能转部门,他需要把转过部门的人员恢复到原来部门进行一次重新的统计

       这时候面对这种新需求,我们应该怎么做,刚开始我想的时候直接修改原来的sql,然后在前端加一个是否统计之前的还是之后的一个flag标志,进行查询,但是原来的sql写到了xml里面,一个sql大概有400行,他们统计调用了好几个接口,加起来修改的sql要有1800行,实在是工作量有点大,觉得这样不可行,然后我又想到 直接复制一份表出来,然后人员部门数据用原来的部门,但是这样业务也有侵入,因为如果这时候人员添加 ,人员转部门我都要在响应的接口上修改,这样修改的太多了,于是这两种方法都作废

 最终我想到用一个视图,写一个查询,根据原来的人员的单位信息表和转单位表做一个连接,用

COALESCE()

函数 直接使用转单位前的数据进行统计,然后重新写一个xml文件,对照着之前的修改一下接口,这样能最少程度上达成任务,减少工作量,而且最少程度侵入业务

这时候我写完之后,自己本机测试没什么问题,大概2秒左右就能出数据,但是当上线到服务器上,测试发现该次查询居然足足用了17秒 如图

这怎么能行!

优化思路

于是我在想改变原来别人写的屎山sql费时又耗力,只能从自己写的视图入手,我先手动在服务器上查询了自己的创建视图的sql,发现用了2.3秒,然后sql又根据视图依次查询好几次,估计叠加起来才那么耗时,于是explan自己的sql语句 发现

这个type是最差的all,过滤的数据只是一百多条,可见性能非常差了,

于是理所当然想到加快查询  那么我们就进行加索引,但是我们怎么加如何加是一个问题

首先我们需要在满足最左前缀法则的基础上,然后不触到索引失效的场景,然后进行加索引

我的视图后面的sql是这样的

所以需要在两张表上加索引,因为我们的shzt 和scbz 都是常量,在sql执行的时候,mysql内部自动优化会先筛选过滤常量的数据,于是我们需要对zzy这张表的shzt 和scbz字段先加索引,然后再xsid和yxpcid 加的索引放到后面,组成一个联合索引, 对于xs表  scbz索引需要放到前面,xsid和yxpcid放到后面就可以了,这样会最大化的利用效率

加完索引我们再explain分析一下发现

type已经变成了ref 也是比较快了,而且都用到了索引。

其中为什么 在xs表中 只用到const 常量索引,是因为 在左连接中xs表的xsid和yxpcid只作为关联条件而不是作为过滤条件,在zzy中这两个字段是过滤条件根据zzy中的两个字段匹配xs中的字段,所以在zzy中能用到

因此索引字段的顺序必须与 “过滤优先级” 一致:过滤性强(能排除大部分数据)的字段放前面,关联字段放后面

 那么有的就会稳了 为什么不把 常量索引放到后面,把字段索引放到前面呢?因为sql执行的时候会优先过滤常量,把常量索引放到前面使用索引的效率更高

  1. 无法优先通过过滤条件缩小范围
    索引会先匹配最左侧的 XSID 和 YXPCID,但这两个字段的值来自 xs 表的关联(即 zzy.XSID 要等于 xs.XSID,而 xs.XSID 是动态的,取决于 xs 表的查询结果)。
    此时,数据库无法先通过 SHZT=1 和 C_SCBZ=0 过滤掉大部分无效记录,只能先根据 xs 表的 XSID 和 YXPCID 去 zzy 表的索引中找匹配的记录,再在这些记录中过滤 SHZT=1 和 C_SCBZ=0
    这相当于 “先找关联,再过滤”,而过滤条件本可以更早排除大量数据,导致索引扫描范围变大。

  2. 极端情况可能索引失效
    如果 zzy 表中 XSID 和 YXPCID 的重复值很多(比如大部分记录的 XSID 都相同),数据库可能认为 “先通过索引找 XSID 再过滤”,不如直接全表扫描后过滤更高效,此时索引会被放弃(type 变为 ALL

假设 zzy 表有 10000 条记录:

  • 其中 SHZT=1 且 C_SCBZ=0 的记录只有 1000 条(有效数据)。
  • 这 1000 条中,与 xs 表关联的 XSIDYXPCID 只有 100 条。
原索引 (SHZT, C_SCBZ, XSID, YXPCID)
  1. 先通过 SHZT=1 和 C_SCBZ=0 从索引中定位到 1000 条有效记录。
  2. 再在这 1000 条中,通过 XSIDYXPCID 关联 xs 表,找到 100 条匹配记录。
    总扫描:1000 条(高效)
颠倒后索引 (XSID, YXPCID, SHZT, C_SCBZ)
  1. 先根据 xs 表的 XSIDYXPCID 去索引中找所有匹配的记录(假设有 5000 条,因为很多 XSID 对应的记录 SHZT 可能≠1)。
  2. 再在这 5000 条中过滤 SHZT=1 和 C_SCBZ=0,最终得到 100 条。
    总扫描:5000 条(低效,比原索引多扫 4000 条)

因此我们需要这样设计索引才更高效

最后的优化查询时间为

后续测试该接口基本稳定在650到700ms

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

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

相关文章

远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV

文章目录前言【视频教程】1.关于LibreTV2.docker部署LibreTV3.简单使用LibreTV4.安装cpolar内网穿透5.配置ward公网地址6.配置固定公网地址总结LibreTV 与 cpolar 的协同应用,为用户打造了一条通往高清观影自由的便捷之路。通过这一方案,用户不仅摆脱了商…

Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南

简介 ECharts 是百度开源的一个使用 JavaScript 实现的开源可视化库,它能够生动、可交互地展示数据。在 Vue3 项目中集成 ECharts 可以让你的项目更加直观和动态地呈现数据信息。 核心优势 特性SVG渲染器Canvas渲染器缩放保真度★★★★★★★☆☆☆动态交互性能…

考公VS考研,拼哪个性价比高?

即将到来下半年,将迎来考公和考研是两个非常重要的考试,也是许多年轻人为之奋斗的目标。无论是获得一份稳定的“铁饭碗”,还是提升学历学位获得更高的竞争力,都是值得努力的方向。那么,考公vs考研,到底哪个…

python2操作neo4j

环境依赖 jdk、neo4j图数据库 操作一条数据完整demo import os,json,sys,io from py2neo import Graph,Nodetry:sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)sys.stderr io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) except Exception:passcla…

AI 编程实践:用 Trae 快速开发 HTML 贪吃蛇游戏

1. 背景与目标 贪吃蛇是最适合入门的 2D 网页小游戏之一:规则简单、反馈清晰、可扩展空间大(穿墙模式、道具、多食物、排行榜……)。 demo地址:https://game.haiyong.site/snake-game.html 本项目的目标是: 纯前端、…

FreeRTOS-C语言指针笔记

文章目录一级指针指针基本概念指针使用示例代码说明二、二级指针二级指针重点解析一级指针 C语言中的指针是一个非常重要的概念,它存储了变量的内存地址。指针的使用可以使程序更加高效,尤其在处理数组、字符串和动态内存分配时。 指针基本概念 指针变…

界面布局智能建议生成:从功能需求到专业UI的AI加速之路

内容简介: 传统界面设计让产品经理陷入"不懂设计、等设计师"的困境,效率低下还容易被挑刺。本文深度解析DeepSeek驱动的界面布局智能生成技术,通过DESIGN框架提示词模板,让产品经理在30分钟内生成3种专业级界面方案,实现…

【BLE系列-第三篇】数据链路层(LL):广播/连接/扫描流程详解

目录 引言 一、广播及连接建立 1.1 广播类型 1.2 扫描/连接请求与响应 1.2.1 广播流程说明 1.2.1.1 广播流程示例图 1.2.1.2 广播信息设置 1.2.1.3 信道广播 1.2.1.4 信道切换 1.2.1.5 广播间隔 1.2.1.6 接收窗口与理论最小传输时间 1.2.2 扫描/连接流程说明 1.2.…

JMeter 测试 WebSocket 接口的详细教程

1. 安装 WebSocket 插件 方法一:通过 Plugins Manager 下载并安装 JMeter Plugins Manager在 JMeter 中:Options → Plugins Manager搜索 WebSocket 并安装 方法二:手动安装 下载 jmeter-websocket-samplers 插件将 jar 文件放到 JMeter/…

飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新

目录一、智慧教育核心场景的技术突破1.1 个性化学习路径推荐系统1.1.1 学习者能力建模与评估1.2 智能教学管理系统1.2.1 自动化作业批改与学情分析1.3 教育资源智能管理系统1.3.1 教育资源智能标签与推荐二、智慧教育系统效能升级实践2.1 教育数据中台构建2.1.1 教育数据整合与…

Java面试场景题大全精简版

1.分布式系统下如何实现服务限流核心算法:固定窗口:将时间划分为固定窗口(如 1 秒),统计窗口内请求数,超过阈值则限流。实现简单但存在临界值突发流量问题。滑动窗口:将固定窗口拆分为多个小窗口…

红帽 AI 推理服务 (vLLM) - 入门篇

《教程汇总》 RedHat AI Inference Server 和 vLLM vLLM (Virtual Large Language Model) 是一款专为大语言模型推理加速而设计的框架。它是由加州大学伯克利分校 (UC Berkeley) 的研究团队于 2023 年开源的项目,目前 UC Berkeley 和 RedHat 分别是 vLLM 开源社区…

Sql server 命令行和控制台使用二三事

近来遇到了几件关于sql server的事情。 第一:低版本sqlserver备份竟然无法还原到高版本 奇怪!从来未碰到过。过程如下: 1.在低版本上中备份好了数据库 2.通过共享将文件拷贝到新服务器上 3.打开控制台,还原数据库,结果…

vue excel转json功能 xlsx

需求: 完成excel表格内容转json,excel表格内可能存在多个表格,要求全部解析出来。完成表格内合服功能,即:提取表格内老服务器与新服务器数据,多台老服务器对应合并到一台新服务器上 3.最终输出结果为:[{‘1…

Qwen-OCR:开源OCR技术的演进与全面分析

目录 一、Qwen-OCR的历史与发展 1.1 起源与早期发展(2018-2020) 1.2 技术突破期(2020-2022) 1.3 开源与生态建设(2022至今) 二、技术竞品分析 2.1 国际主流OCR解决方案对比 2.2 国内竞品分析 三、部署需求与技术规格 3.1 硬件需求 3.2 软件依赖 3.3 云部署方案 四、…

可视化+自动化:招聘管理看板软件的核心技术架构解析

引言:现代招聘的挑战与转型随着全球化和科技的迅速发展,企业的人力资源管理面临着前所未有的挑战。尤其是在招聘环节,随着人才市场的竞争日益激烈,企业必须在确保招聘质量的同时,提升招聘效率。这不仅要求招聘人员具备…

【数据结构】——栈(Stack)的原理与实现

目录一. 栈的认识1. 栈的基本概念2.栈的基本操作二. 栈的核心优势1. 高效的时间复杂度2. 简洁的逻辑设计3. 内存管理优化三. 栈的代码实现1.栈的结构定义2. 栈的初始化3. 入栈 (动态扩容)4. 出栈5. 取栈顶数据6. 判断栈是否为空7. 获取栈的数据个数8.销毁…

使用TexLive与VScode排版论文

前言 中文稿目前已经完成了,现在要转用latex排版,但我对这方面没有接触过,这里做一个记录。 网页版Overleaf:Overleaf, 在线LaTeX编辑器。 TeXWorks:论文神器teXWorks安装与使用记录。 这里我还是决定采用Vscode作…

每日一题:2的幂数组中查询范围内的乘积;快速幂算法

题目选自2438. 二的幂数组中查询范围内的乘积 还是一样的,先讲解思路,然后再说代码。 题目有一定难度,所以我要争取使所有人都能看懂,用的方法会用最常规的思想。关于语言,都是互通的,只要你懂了一门语言…

Ceph数据副本机制详解

Ceph 数据副本机制详解 Ceph 的数据副本机制是其保证数据可靠性和高可用性的核心设计,主要通过多副本(Replication) 和 纠删码(Erasure Coding,EC) 两种方式实现。以下是对 Ceph 数据副本机制的全面解析&am…