首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 效能調優五大技巧與工具推薦:查詢快取、EXPLAIN、LIMIT 1、索引覆蓋、連線型別一致

     編輯:MySQL 資料庫相關知識

技巧 1:善用查詢快取 (Query Cache) — 5.7 以前 / 8.0 移除

原理:相同 SELECT 直接返回快取結果,零解析、零執行。

-- 失效寫法 (函數、非確定性)
SELECT * FROM users WHERE signup_date >= CURDATE();

-- 生效寫法 (固定值)
$today = date('Y-m-d');
SELECT * FROM users WHERE signup_date >= '$today';

⚠️ MySQL 8.0 已移除 Query Cache,改用 ProxySQL 快取、Redis 應用層快取、Prepared Statement 重用執行計畫。

技巧 2:EXPLAIN 看透執行計畫

EXPLAIN SELECT * FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'paid' AND u.city = 'Taipei';

關鍵欄位解讀

欄位理想值異常值處理
typeref / eq_ref / rangeALL (全表掃描) → 加索引
key實際用到的索引名NULL → 無索引可用
rows預估掃描行數越少越好巨大 → 條件/索引優化
ExtraUsing index (覆蓋索引)Using filesort/temporary → 優化 ORDER BY/GROUP BY

技巧 3:LIMIT 1 取存在性檢查

-- 低效
SELECT * FROM users WHERE city = 'Taipei';
IF (mysqli_num_rows($r) > 0) ...

-- 高效
SELECT 1 FROM users WHERE city = 'Taipei' LIMIT 1;
-- 引擎命中第一行即停止,不掃描全表

技巧 4:索引覆蓋查詢欄位

  • WHERE、JOIN、ORDER BY、GROUP BY、MAX/MIN 條件欄位 → 建立索引
  • 複合索引遵循 最左前綴:INDEX (a,b,c) 支援 a、a,b、a,b,c
  • 覆蓋索引:SELECT a,b FROM t WHERE c=1 + INDEX (c,a,b) → Extra: Using index,無需回表

技巧 5:連線欄位型別、編碼、長度完全一致

-- 低效:型別不匹配導致隱式轉換、索引失效
SELECT * FROM users u
JOIN orders o ON u.phone = o.user_phone;  -- u.phone VARCHAR(20), o.user_phone CHAR(11)

-- 高效:統一型別、長度、字元集
ALTER TABLE orders MODIFY user_phone VARCHAR(20) CHARSET utf8mb4;
-- 或建立函數索引 (8.0+) / 生成欄位

推薦調優工具鏈

工具定位特色
Percona Toolkit (pt-query-digest)慢查詢分析聚合、排序、抽樣、報表生成
sys Schema (sys.* views)內建診斷8.0 內建、statement 分析、IO、鎖、等待
MySQL Workbench Performance Dashboard圖形化監控即時 QPS、緩衝區命中、鎖等待
Prometheus + mysqld_exporter + Grafana生產監控全指標採集、告警、儀表板
GH-OST / pt-online-schema-changeOnline DDL無鎖結構變更、可暫停/限流

結語

調優無銀彈,只有觀測 → 定位 → 驗證 → 沉澱閉環。將五大技巧內化為代碼審查清單,配合工具鏈持續巡檢,效能問題才能在發酵前被消滅。

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