MySQL慢SQL優化全攻略:從診斷到調優

目錄

慢SQL日志分析與診斷

開啟慢查詢日志

慢查詢日志分析工具

慢SQL優化策略

1. 避免SELECT * 查詢

2. 創建高效索引

索引選擇原則

索引使用注意事項

3. 使用EXPLAIN分析執行計劃

4. 優化排序操作

5. 解決深分頁問題

6. 避免全表掃描

7. 優化JOIN操作

8. 合理使用子查詢

高級優化技巧

1. 使用覆蓋索引

2. 索引條件下推(ICP)

3. 使用批處理減少交互

4. 合理使用臨時表

名詞解釋

總結


慢SQL日志分析與診斷

開啟慢查詢日志

-- 開啟慢查詢日志功能
SET GLOBAL slow_query_log = 'ON';-- 設置慢SQL時間閾值(單位:秒),超過此時間的查詢會被記錄
SET GLOBAL long_query_time = 5;-- 查看慢查詢日志文件位置
SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file';-- 使用mysqldumpslow工具分析慢查詢日志
-- 常用參數:-s排序方式(t按時間,c按次數),-t顯示前N條
-- 示例:mysqldumpslow -s t -t 10 /var/logs/mysql/slow.log

慢查詢日志分析工具

除了mysqldumpslow,還可以使用:

  1. ??pt-query-digest??(Percona Toolkit的一部分):更強大的日志分析工具

    pt-query-digest /var/logs/mysql/slow.log
  2. ??MySQL Workbench??:圖形化界面分析工具

慢SQL優化策略

1. 避免SELECT * 查詢

-- 不推薦
SELECT * FROM users WHERE id = 1;-- 推薦:只查詢需要的列
SELECT id, username, email FROM users WHERE id = 1;

??原因??:

  • 增加網絡I/O負擔
  • 當表中有大字段(如TEXT/BLOB)時性能影響顯著
  • 可能使覆蓋索引失效(后面會解釋)

2. 創建高效索引

索引選擇原則
  • ??高區分度??:選擇區分度高的列建索引(如用戶ID比性別更適合)
  • ??常用查詢條件??:為WHERE、JOIN、ORDER BY、GROUP BY中的列建索引
  • ??短字段優先??:整型字段比字符串字段更適合做索引
-- 創建單列索引
CREATE INDEX idx_username ON users(username);-- 創建復合索引
CREATE INDEX idx_status_created ON orders(status, created_at);
索引使用注意事項
  • ??最左匹配原則??:復合索引必須從左到右使用

    -- 對于INDEX(a, b, c)
    WHERE a = 1 AND b = 2 -- 使用索引
    WHERE b = 2 AND c = 3 -- 不使用索引(缺少a)
    WHERE a = 1 AND c = 3 -- 部分使用索引(只用a)
  • ??避免索引失效??:

    • 不要在索引列上使用函數:WHERE YEAR(create_time) = 2023
    • 避免隱式類型轉換:WHERE user_id = '123'(user_id是整型)
    • 避免使用!=NOT INIS NULL等操作符

3. 使用EXPLAIN分析執行計劃

EXPLAIN SELECT * FROM users WHERE username = 'john';

??關鍵指標解讀??:

  • ??type??:訪問類型(從好到差:system > const > eq_ref > ref > range > index > ALL)
  • ??possible_keys??:可能使用的索引
  • ??key??:實際使用的索引
  • ??rows??:預估需要檢查的行數
  • ??Extra??:額外信息(如Using filesort、Using temporary表示性能問題)

4. 優化排序操作

-- 不推薦:大數據集文件排序
SELECT * FROM products ORDER BY price DESC LIMIT 100;-- 推薦:為排序字段添加索引
ALTER TABLE products ADD INDEX idx_price (price);
SELECT * FROM products ORDER BY price DESC LIMIT 100;

??原理??:B+樹索引本身是有序的,利用索引可以避免內存排序(Using filesort)

5. 解決深分頁問題

??問題??:LIMIT 10000, 20會先讀取10020條記錄,然后丟棄前10000條

??優化方案??:

  1. ??使用覆蓋索引+延遲關聯??

    SELECT * FROM products JOIN (SELECT id FROM products WHERE category_id = 5 ORDER BY created_at DESC LIMIT 10000, 20
    ) AS tmp USING(id);
  2. ??記錄上次查詢位置??(適用于有序數據)

    -- 第一頁
    SELECT * FROM products ORDER BY id DESC LIMIT 20;-- 后續頁(假設上一頁最后一條記錄的id是12345)
    SELECT * FROM products WHERE id < 12345 ORDER BY id DESC LIMIT 20;

6. 避免全表掃描

  • 為查詢條件添加適當的索引
  • 避免在WHERE子句中對字段進行運算或使用函數
  • 使用合適的查詢條件,避免過于寬泛的條件

7. 優化JOIN操作

  • 確保JOIN字段有索引
  • 小表驅動大表(MySQL優化器通常會自動處理)
  • 避免多表JOIN(超過3個表考慮反范式化設計)

8. 合理使用子查詢

-- 不推薦:相關子查詢
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000
);-- 推薦:改用JOIN
SELECT DISTINCT u.* FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 1000;

高級優化技巧

1. 使用覆蓋索引

??覆蓋索引??:查詢的所有字段都包含在索引中,無需回表

-- 假設有INDEX(username, email)
SELECT username, email FROM users WHERE username = 'john';

??優勢??:減少I/O操作,提高查詢速度

2. 索引條件下推(ICP)

MySQL 5.6+特性,將WHERE條件推到存儲引擎層過濾

-- 假設有INDEX(a, b)
SELECT * FROM table WHERE a = 1 AND b LIKE '%test%';

3. 使用批處理減少交互

-- 不推薦
INSERT INTO users(name) VALUES ('a');
INSERT INTO users(name) VALUES ('b');-- 推薦
INSERT INTO users(name) VALUES ('a'), ('b');

4. 合理使用臨時表

對于復雜查詢,可以考慮使用臨時表分步處理

CREATE TEMPORARY TABLE temp_orders
SELECT user_id, SUM(amount) AS total 
FROM orders 
GROUP BY user_id
HAVING total > 1000;SELECT u.* FROM users u
JOIN temp_orders t ON u.id = t.user_id;

名詞解釋

  1. ??B+樹??:MySQL索引的數據結構,特點是:

    • 所有數據都存儲在葉子節點
    • 葉子節點通過指針連接,適合范圍查詢
    • 樹的高度低,查詢效率穩定
  2. ??回表??:當使用非主鍵索引查詢時,先通過索引找到主鍵,再通過主鍵索引查找完整數據的過程

  3. ??覆蓋索引??:查詢的列都包含在索引中,無需回表

  4. ??最左匹配原則??:復合索引必須從左到右使用,不能跳過前面的列

  5. ??深分頁??:當LIMIT offset很大時(如LIMIT 100000, 10),MySQL需要先讀取offset+limit條記錄,性能差

  6. ??Using filesort??:表示MySQL需要進行額外的排序操作,通常是因為沒有使用索引排序

  7. ??Using temporary??:表示MySQL需要創建臨時表來處理查詢,常見于GROUP BY、ORDER BY等操作

總結

慢SQL優化是一個系統工程,需要:

  1. 通過慢查詢日志定位問題SQL
  2. 使用EXPLAIN分析執行計劃
  3. 針對性應用優化策略
  4. 持續監控優化效果

記住:索引不是越多越好,每個索引都會增加寫操作的成本。好的數據庫設計加上合理的索引策略,才能獲得最佳性能。

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

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

相關文章

OPENPPP2 VMUX 技術探秘(高級指南)

&#x1f680; VMUX技術分析&#xff1a;OPENPPP2中的虛擬多路復用技術 &#x1f31f; 一、技術目標 &#x1f517; 連接多路復用 通過單個或多個物理鏈路&#xff0c;承載多個邏輯TCP連接。 &#x1f680; 高性能傳輸 支持數據包亂序重組實現動態流量控制&#xff08;擁塞檢測…

Linux系統時間不對導致mysql初始化失敗:Data Dictionary initialization failed.(數據字典版本驗證失敗)

文章目錄 問題描述分析**問題原因分析****解決方案****1. 修正系統時間****2. 檢查數據目錄完整性****3. 重新初始化數據目錄****4. 調整 MySQL 配置** **驗證與后續步驟****注意事項** 其他說明 問題描述 mysql數據初始化失敗&#xff0c;發現系統時間是1970年&#xff0c;我…

有趣的python程序Part1:如何根據記憶曲線使用python編寫一個單詞記憶默寫程序

目錄 前言 1. 數據管理模塊 2. 記憶算法實現 3. 持久化存儲 4. 用戶界面實現 5.整合與測試 前言 此篇文章為“有趣的python程序”專欄的第一篇文章&#xff0c;本專欄致力于分享一些有趣的編程作品&#xff0c;如果能夠使您產生興趣&#xff0c;不妨來動手改編使之成為更好…

【案例】性能優化在持續集成與持續交付中的應用

【案例】性能優化在持續集成與持續交付中的應用 為了更好地理解性能優化在CI/CD流程中的實際應用&#xff0c;本節將結合一個典型案例&#xff0c;從代碼提交到部署上線的完整流程中&#xff0c;講解如何嵌入性能檢測與自動化優化機制&#xff0c;并使用結構化流程圖直觀展示關…

P7 QT項目----會學天氣預報(完結)

7.8 QMap 在 Qt 中&#xff0c;如果你想要將 JSON 數據解析到一個 QMap 中&#xff0c;你可以遍歷 JSON 對象的所有鍵值對&#xff0c;并將它們添加到 QMap 里。這個方法特別適合于當你的 JSON 對象是一個簡單的鍵值對集合時。以下是一個如何實現這一點的示例。 示例&#…

操作系統筆記(關于進程引入和狀態的切換)

1.前言 今天下午結束了英語的四六級考試&#xff0c;終于是結束了&#xff0c;最近的這個考試太密集&#xff0c;周四的專業基礎課考試&#xff0c;周五的這個線性代數的考試和這個周六的英語四六級考試&#xff0c;吧我都要烤焦了&#xff0c;最近也是疲于應對這個考試&#…

M1芯片macOS安裝Xinference部署大模型

如果你看的是官方手冊&#xff1a;安裝 — Xinference 千萬不要直接運行&#xff1a; pip install "xinference[all]" 會遇到幾個問題&#xff1a; 1&#xff09;Python版本如果太新可能安裝失敗 2&#xff09;全量安裝會失敗 3&#xff09;未科學上網可能會time…

【ONNX量化實戰】使用ONNX Runtime進行靜態量化

目錄 什么是量化量化實現的原理實戰準備數據執行量化 驗證量化結語 什么是量化 量化是一種常見的深度學習技術&#xff0c;其目的在于將原始的深度神經網絡權重從高位原始位數被動態縮放至低位目標尾數。例如從FP32&#xff08;32位浮點&#xff09;量化值INT8&#xff08;8位…

【量子計算】格羅弗算法

文章目錄 &#x1f50d; 一、算法原理與工作機制? 二、性能優勢&#xff1a;二次加速的體現&#x1f310; 三、應用場景?? 四、局限性與挑戰&#x1f52e; 五、未來展望&#x1f48e; 總結 格羅弗算法&#xff08;Grover’s algorithm&#xff09;是量子計算領域的核心算法之…

C++ 互斥量

在 C 中&#xff0c;互斥量&#xff08;std::mutex&#xff09;是一種用于多線程編程中保護共享資源的機制&#xff0c;防止多個線程同時訪問某個資源&#xff0c;從而避免數據競爭&#xff08;data race&#xff09;和不一致的問題。 &#x1f512; 一、基礎用法&#xff1a;s…

CSS Content符號編碼大全

資源寶整理分享&#xff1a;?https://www.httple.net? 前端開發中常用的特殊符號查詢工具&#xff0c;包含Unicode編碼和HTML實體編碼&#xff0c;方便開發者快速查找和使用各種符號。支持基本形狀、箭頭、數學符號、貨幣符號等多種分類。 前端最常用符號 圖標形狀十進制十…

RPC常見問題回答

項目流程和架構設計 1.服務端的功能&#xff1a; 1.提供rpc調用對應的函數 2.完成服務注冊 服務發現 上線/下線通知 3.提供主題的操作 (創建/刪除/訂閱/取消訂閱) 消息的發布 2.服務的模塊劃分 1.網絡通信模塊 net 底層套用的moude庫 2.應用層通信協議模塊 1.序列化 反序列化數…

【JavaEE】(3) 多線程2

一、常見的鎖策略 1、樂觀鎖和悲觀鎖 悲觀鎖&#xff1a;預測鎖沖突的概率較高。在鎖中加阻塞操作。樂觀鎖&#xff1a;預測鎖沖突的概率較低。使用忙等/版本號等&#xff0c;不產生阻塞。 2、輕量級鎖和重量級鎖 重量級鎖&#xff1a;加鎖的開銷較大&#xff0c;線程等待鎖…

創客匠人服務體系解析:知識 IP 變現的全鏈路賦能模型

在知識服務行業深度轉型期&#xff0c;創客匠人通過 “工具 陪跑 圈層” 的三維服務體系&#xff0c;構建了從 IP 定位到商業變現的完整賦能鏈條。這套經過 5 萬 知識博主驗證的模型&#xff0c;不僅解決了 “內容生產 - 流量獲取 - 用戶轉化” 的實操難題&#xff0c;更推動…

國產ARM/RISCV與OpenHarmony物聯網項目(六)SF1節點開發

一、終端節點功能設計 1. 功能說明 終端節點設計的是基于鴻蒙操作系統的 TCP 服務器程序&#xff0c;用于監測空氣質量并提供遠程控制功能。與之前的光照監測程序相比&#xff0c;這個程序使用 E53_SF1 模塊&#xff08;煙霧 / 氣體傳感器&#xff09;&#xff0c;主要功能包…

Plotly圖表全面使用指南 -- Displaying Figures in Python

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 在 Python 中顯示圖形 使用 Plotly 的 Python 圖形庫顯示圖形。 顯示圖形 Plotly的Python圖形庫plotly.py提供了多種顯示圖形的選項和方法…

getx用法詳細解析以及注意事項

源碼地址 在 Flutter 中&#xff0c;Get 是來自 get 包的一個輕量級、功能強大的狀態管理與路由框架&#xff0c;常用于&#xff1a; 狀態管理路由管理依賴注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多語言&#xff09; 下面是 …

深度學習:人工神經網絡基礎概念

本文目錄&#xff1a; 一、什么是神經網絡二、如何構建神經網絡三、神經網絡內部狀態值和激活值 一、什么是神經網絡 人工神經網絡&#xff08;Artificial Neural Network&#xff0c; 簡寫為ANN&#xff09;也簡稱為神經網絡&#xff08;NN&#xff09;&#xff0c;是一種模仿…

Unity2D 街機風太空射擊游戲 學習記錄 #12環射道具的引入

概述 這是一款基于Unity引擎開發的2D街機風太空射擊游戲&#xff0c;筆者并不是游戲開發人&#xff0c;作者是siki學院的涼鞋老師。 筆者只是學習項目&#xff0c;記錄學習&#xff0c;同時也想幫助他人更好的學習這個項目 作者會記錄學習這一期用到的知識&#xff0c;和一些…

網站如何啟用HTTPS訪問?本地內網部署的https網站怎么在外網打開?

在互聯網的世界里&#xff0c;數據安全已經成為了每個網站和用戶都不得不面對的問題。近期&#xff0c;網絡信息泄露事件頻發&#xff0c;讓越來越多的網站開始重視起用戶數據的安全性&#xff0c;因此啟用HTTPS訪問成為了一個熱門話題。作為一名網絡安全專家&#xff0c;我希望…