首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL SQL調優實戰筆記:從頻率分析到執行計劃深度剖析

     編輯:MySQL 綜合教學

面對效能瓶頸,系統性的SQL調優流程比零散優化更關鍵。本文構建「頻率分析→慢查詢定位→執行計劃剖析」三階段調優方法論,並詳細解讀EXPLAIN輸出各欄位含義與優化指引。

階段一:掌握SQL執行頻率畫像

SHOW STATUS LIKE 'Com_%';

關鍵計數器:

  • Com_select、Com_insert、Com_update、Com_delete:各操作執行次數(批量INSERT僅計1次)
  • Innodb_rows_read/inserted/updated/deleted:InnoDB層面行級統計,算法不同
  • Com_commit/Com_rollback:事務提交/回滾頻率,回滾頻繁提示邏輯異常

資料庫負載特徵判斷:以查詢為主?寫入為主?混合負載?

階段二:精準定位低效SQL

1. 慢查詢日誌(事後分析)

mysqld --log-slow-queries[=file_name] --long_query_time=N

記錄執行超過N秒的SQL,適合定期審計。

2. SHOW PROCESSLIST(實時監控)

SHOW [FULL] PROCESSLIST;

即時查看執行中線程、狀態、鎖表情況,適合突發效能故障排查。

階段三:EXPLAIN深度剖析執行計劃

EXPLAIN SELECT SUM(moneys) FROM sales a JOIN company b 
  ON a.company_id = b.id WHERE a.year = 2023\G

核心欄位解讀:

欄位含義關鍵判讀
id查詢序號同id按順序執行,不同id越大越先執行
select_type查詢類型SIMPLE/PRIMARY/UNION/SUBQUERY/DERIVED
table輸出結果表別名或衍生表
type連接類型(效能關鍵)system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
possible_keys可能用到的索引為空表示無索引可用
key實際使用索引為NULL表示全表掃描
key_len索引長度推斷複合索引用了幾列
ref索引比較值來源const/函數/欄位名
rows預估掃描行數越小越好,統計資訊準確性關鍵
Extra額外資訊Using index(覆蓋索引)/Using where/Using filesort/Using temporary

實戰判讀範例:

-- 表a:type=ALL, key=NULL, rows=1000, Extra=Using where
-- 表b:type=ref, key=ind_company_id, rows=1, Extra=Using where;Using index

-- 診斷:表a無索引全表掃描1000行,表b走索引覆蓋查詢
-- 優化:為sales.year建立索引或複合索引(company_id, year)

type類型效能階梯詳細說明

  • system/const:常量表/唯一索引等值查詢,極快
  • eq_ref:主鍵/唯一索引JOIN,每行匹配1行
  • ref:普通索引等值查詢/JOIN
  • range:索引範圍掃描(>/</BETWEEN/IN)
  • index:全索引掃描(覆蓋索引時出現)
  • ALL:全表掃描,需優化

建立「頻率基線→慢查詢收集→計劃剖析→索引優化→驗證回歸」閉環流程,是MySQL調優從藝術走向工程化的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved