MySQL慢查詢全攻略:定位、分析與優化實戰

🚀 MySQL慢查詢全攻略:定位、分析與優化實戰

#數據庫優化 #性能調優 #SQL優化 #MySQL實戰


一、慢查詢定位:找到性能瓶頸

1.1 開啟慢查詢日志

-- 查看當前配置  
SHOW VARIABLES LIKE '%slow_query%';  -- 動態開啟(重啟失效)  
SET GLOBAL slow_query_log = 'ON';  
SET GLOBAL long_query_time = 2;  -- 閾值設為2秒  
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';  -- 永久生效(修改my.cnf)  
[mysqld]  
slow_query_log = 1  
slow_query_log_file = /var/log/mysql/slow.log  
long_query_time = 2  
log_queries_not_using_indexes = 1  -- 記錄未走索引的查詢  

1.2 分析工具推薦

工具使用場景命令示例
mysqldumpslow官方自帶,基礎分析mysqldumpslow -s t /path/to/slow.log
pt-query-digest高級分析,生成詳細報告pt-query-digest slow.log > report.txt
Percona Toolkit專業級分析,支持多維度統計pt-query-digest --filter '$event->{arg} =~ m/SELECT/i' slow.log

二、核心優化策略:從SQL到架構

2.1 索引優化(90%的性能問題根源)

黃金法則

  • 最左前綴原則:聯合索引按字段順序匹配
  • 覆蓋索引:SELECT字段全在索引中,避免回表
  • 索引選擇性:區分度高的字段(如唯一ID)優先建索引

示例優化

-- 優化前(全表掃描)  
SELECT * FROM orders WHERE status = 'paid' AND create_time > '2023-01-01';  -- 添加聯合索引  
ALTER TABLE orders ADD INDEX idx_status_time(status, create_time);  -- 優化后(索引范圍掃描)  
SELECT id, status, amount FROM orders   
WHERE status = 'paid' AND create_time > '2023-01-01';  

2.2 SQL語句重構

常見問題與解決方案

問題類型優化方案示例
大分頁查詢使用WHERE替代LIMIT OFFSETWHERE id > 1000 LIMIT 10
隱式類型轉換保持字段與參數類型一致WHERE phone = '13800138000'
不必要的排序移除ORDER BY或添加索引添加INDEX(create_time)
IN子查詢改用JOINJOIN (SELECT id FROM ...) tmp

2.3 EXPLAIN執行計劃解析

關鍵字段解讀

EXPLAIN SELECT * FROM users WHERE age > 20;  
字段理想值問題信號
typeref/range/indexALL(全表掃描)
key使用索引名稱NULL(未用索引)
rows掃描行數少數值過大(如>10000)
ExtraUsing indexUsing filesort/Using temporary

三、高級調優:參數與架構升級

3.1 參數優化(my.cnf關鍵配置)

[mysqld]  
# 緩沖池大小(通常設為物理內存的70%-80%)  
innodb_buffer_pool_size = 8G  # 日志寫入策略  
innodb_flush_log_at_trx_commit = 1  # 高安全要求  
innodb_flush_log_at_trx_commit = 2  # 高性能場景  # 連接管理  
max_connections = 500  
thread_cache_size = 50  

3.2 架構升級方案

場景解決方案優勢
單表數據量過大(>5000萬)分庫分表(Sharding)水平擴展,降低單表壓力
高頻復雜查詢讀寫分離(主從復制)分散讀壓力
實時分析需求使用列式存儲(如ClickHouse)提升聚合查詢速度

四、預防與監控:建立長效機制

4.1 實時監控工具

  • Percona Monitoring and Management (PMM):監控慢查詢、鎖等待
  • Prometheus + Grafana:自定義指標可視化
  • MySQL Enterprise Monitor:官方企業級方案

4.2 自動化優化建議

-- 使用內置診斷工具  
ANALYZE TABLE orders;  -- 更新統計信息  
OPTIMIZE TABLE logs;   -- 重建表(針對碎片化嚴重場景)  -- 查詢優化建議器  
SELECT * FROM sys.schema_index_statistics;  
SELECT * FROM sys.statements_with_full_table_scans;  

五、實戰案例:電商訂單查詢優化

5.1 原始慢查詢(執行時間3.2秒)

SELECT * FROM orders  
WHERE user_id = 1001  AND status IN ('paid', 'shipped')  
ORDER BY create_time DESC  
LIMIT 0, 10;  

5.2 優化步驟

  1. 執行計劃分析:發現type=ALL,未使用索引

  2. 創建覆蓋索引

    ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);  
    
  3. SQL改寫

    SELECT id, user_id, status, amount, create_time  
    FROM orders  
    WHERE user_id = 1001  AND status IN ('paid', 'shipped')  
    ORDER BY create_time DESC  
    LIMIT 10;  
    
  4. 結果:執行時間降至28ms,提升115倍!


總結:MySQL慢查詢優化需結合索引策略、SQL重構、參數調優三位一體。通過EXPLAIN分析執行計劃,使用pt-query-digest定位問題查詢,建立監控體系預防性能退化,方能實現數據庫高效穩定運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75619.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

當原型圖與文字說明完全不同時,測試要怎么做?

當測試遇上左右手互搏的需求,怎么辦? "這個彈窗樣式怎么和文檔寫的不一樣?"、"按鈕位置怎么跑到左邊去了?"——根據Deloitte的調查,62%的項目存在原型圖與需求文檔不一致的情況。這種"精神分…

關于量化交易在拉盤砸盤方面應用的部分思考

關于“砸盤”的深層解析與操盤邏輯 ??一、砸盤的本質與市場含義?? ??砸盤??指通過集中拋售大量籌碼導致價格快速下跌的行為,其核心目標是??制造恐慌、清洗浮籌或實現利益再分配??。不同場景下的砸盤含義不同: ??主動砸盤(操控…

【項目管理】第12章 項目質量管理-- 知識點整理

項目管理-相關文檔,希望互相學習,共同進步 風123456789~-CSDN博客 (一)知識總覽 項目管理知識域 知識點: (項目管理概論、立項管理、十大知識域、配置與變更管理、績效域) 對應:第6章-第19章 第6章 項目管理概論 4分第13章 項目資源管理 3-4分第7章 項目…

一個好看的圖集展示html頁面源碼

源碼介紹 一個好看的圖集展示html頁面源碼,適合展示自己的作品,頁面美觀大氣,也可以作為產品展示或者個人引導頁等等 源碼由HTMLCSSJS組成,記事本打開源碼文件可以進行內容文字之類的修改, 雙擊html文件可以本地運行…

2021第十二屆藍橋杯大賽軟件賽省賽C/C++ 大學 B 組

記錄刷題的過程、感悟、題解。 希望能幫到,那些與我一同前行的,來自遠方的朋友😉 大綱: 1、空間-(題解)-字節單位轉換 2、卡片-(題解)-可以不用當組合來寫,思維題 3、直…

LabVIEW 中 JSON 數據與簇的轉換

在 LabVIEW 編程中,數據格式的處理與轉換是極為關鍵的環節。其中,將數據在 JSON 格式與 LabVIEW 的簇結構之間進行轉換是一項常見且重要的操作。這里展示的程序片段就涉及到這一關鍵功能,以下將詳細介紹。 一、JSON 數據與簇的轉換功能 &am…

藍橋杯大模板

init.c void System_Init() {P0 0x00; //關閉蜂鳴器和繼電器P2 P2 & 0x1f | 0xa0;P2 & 0x1f;P0 0x00; //關閉LEDP2 P2 & 0x1f | 0x80;P2 & 0x1f; } led.c #include <LED.H>idata unsigned char temp_1 0x00; idata unsigned char temp_old…

通過HTTP協議實現Git免密操作的解決方案

工作中會遇到這樣的問題的。 通過HTTP協議實現Git免密操作的解決方案 方法一&#xff1a;啟用全局憑據存儲&#xff08;推薦&#xff09; 配置憑證存儲? 執行以下命令&#xff0c;讓Git永久保存賬號密碼&#xff08;首次操作后生效&#xff09;&#xff1a; git config --g…

Java常見面試問題

一.Liunx 二.Java基礎 1.final 2.static 3.與equals 三.Collection 1.LIst 2.Map 3.Stream 四、多線程 1.實現方法 2.線程池核心參數 3.應用場景 五、JVM 1.堆 2.棧 六、Spring 1.面向對象 2.IOC 3.AOP 七、Springboot 1.自動裝配 八、SpringCloud 1.Nacos 2.seata 3.ga…

【藍橋杯】第十六屆藍橋杯 JAVA B組記錄

試題 A: 逃離高塔 很簡單&#xff0c;簽到題&#xff0c;但是需要注意精度&#xff0c;用int會有溢出風險 答案&#xff1a;202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

PyTorch Tensor維度變換實戰:view/squeeze/expand/repeat全解析

本文從圖像數據處理、模型輸入適配等實際場景出發&#xff0c;系統講解PyTorch中view、squeeze、expand和repeat四大維度變換方法。通過代碼演示對比不同方法的適用性&#xff0c;助您掌握數據維度調整的核心技巧。 一、基礎維度操作方法 1. view&#xff1a;內存連續的形狀重…

Kubernetes nodeName Manual Scheduling practice (K8S節點名稱綁定以及手工調度)

Manual Scheduling 在 Kubernetes 中&#xff0c;手動調度框架允許您將 Pod 分配到特定節點&#xff0c;而無需依賴默認調度器。這對于測試、調試或處理特定工作負載非常有用。您可以通過在 Pod 的規范中設置 nodeName 字段來實現手動調度。以下是一個示例&#xff1a; apiVe…

即時編譯器(JIT)的編譯過程是什么?

1. 觸發編譯 JIT編譯的觸發基于熱點代碼檢測&#xff0c;主要通過兩種計數器&#xff1a; ? 方法調用計數器&#xff1a;統計方法被調用的次數&#xff08;默認閾值&#xff1a;C1為1,500次&#xff0c;C2為10,000次&#xff09;。 ? 回邊計數器&#xff1a;統計循環體的執行…

Java基礎:集合List、Map、Set(超詳細版)

集合體系概述 Collection常用方法 補充&#xff1a;addAll() Collection的遍歷方式 迭代器 增強for&#xff08;空集合可以&#xff0c;null不可以&#xff09; lambda 集合對象存儲對象原理 遍歷方式的區別 List集合 特點、特有方法 遍歷方式 &#xff08;同上&#xff09…

Elasticsearch 全面解析

Elasticsearch 全面解析 前言一、簡介核心特性應用場景 二、核心原理與架構設計1. 倒排索引&#xff08;Inverted Index&#xff09;2. 分片與副本機制&#xff08;Sharding & Replication&#xff09;3. 節點角色與集群管理 三、核心特點1. 靈活的查詢語言&#xff08;Que…

【2】k8s集群管理系列--包應用管理器之helm(Chart語法深入應用)

一、Chart模板&#xff1a;函數與管道 常用函數&#xff1a; ? quote&#xff1a;將值轉換為字符串&#xff0c;即加雙引號 ? default&#xff1a;設置默認值&#xff0c;如果獲取的值為空則為默認值 ? indent和nindent&#xff1a;縮進字符串 ? toYaml&#xff1a;引用一…

JVM 字節碼是如何存儲信息的?

JVM 字節碼是 Java 虛擬機 (JVM) 執行的指令集&#xff0c;它是一種與平臺無關的二進制格式&#xff0c;在任何支持 JVM 的平臺上都可運行的Java 程序。 字節碼存儲信息的方式&#xff0c;主要通過以下幾個關鍵組成部分和機制來實現&#xff1a; 1. 指令 (Opcodes) 和 操作數 …

基于51單片機語音實時采集系統

基于51單片機語音實時采集 &#xff08;程序&#xff0b;原理圖&#xff0b;PCB&#xff0b;設計報告&#xff09; 功能介紹 具體功能&#xff1a; 系統由STC89C52單片機ISD4004錄音芯片LM386功放模塊小喇叭LCD1602按鍵指示燈電源構成 1.可通過按鍵隨時選擇相應的錄音進行播…

關于 Java 預先編譯(AOT)技術的詳細說明,涵蓋 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及優缺點對比

以下是關于 Java 預先編譯&#xff08;AOT&#xff09;技術的詳細說明&#xff0c;涵蓋 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及優缺點對比&#xff1a; 1. 預先編譯&#xff08;AOT&#xff09;技術詳解 1.1 核心概念 AOT&#xff08;Ahead-of-Time&#xff09…

【ROS2】行為樹:BehaviorTree

1、簡介 與狀態機不同,行為樹強調執行動作,而不是狀態之間的轉換。 行為樹是可組合的。可以重復使用簡單的行為來構建復雜的行為。 在游戲領域,行為樹已經比較流行了。主要用于維護游戲角色的各種動作和狀態。 ROS2的導航框架Navigation2中引入了行為樹來組織機器人的工作流…