真實業務場景: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
英文地址,請注明出處:http://en.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…