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

MySQL 索引設計與查詢優化器:從原理到 EXPLAIN 實戰

     編輯:MySQL 資料庫相關知識

索引優勢與代價

優點缺點
避免全表掃描、快速定位佔用磁碟空間
多表 JOIN 消除笛卡爾積爆炸降低 INSERT/UPDATE/DELETE 速度
MIN/MAX 直接取值無需掃表
ORDER BY/GROUP BY 利用有序性
覆蓋索引 (Covering Index) 只讀索引不回表

索引欄位選擇黃金法則

  1. 出現在 WHERE、JOIN ON、ORDER BY、GROUP BY 的欄位
  2. 優先唯一索引:選擇性最高
  3. 前綴索引:字串只索引前 10~20 字元 INDEX idx_name (name(10)) — 減 I/O、提高緩存命中率
  4. 最左前綴原則:複合索引 (a,b,c),a 是最左前綴,查詢必須從 a 開始才能用到索引
  5. 適度建索引:單表 5~8 個索引為宜,過多反拖慢寫入
  6. 針對比較操作:<、<=、=、>=、>、BETWEEN、IN 可用索引;!=、NOT IN、LIKE '%abc' 通常不可用

慢查詢發現與優化流程

  1. 開啟慢查詢日誌:slow_query_log=1, long_query_time=1
  2. mysqldumpslow -s t /var/log/mysql/slow.log 找出耗時 Top SQL
  3. EXPLAIN SELECT ... 分析執行計劃
  4. 針對性加索引、改寫 SQL、調整 JOIN 順序 (STRAIGHT_JOIN)

EXPLAIN 關鍵欄位解讀

欄位關注點理想值
type連接類型ref、eq_ref、range、index_merge;避免 ALL (全表掃描)
key實際用到的索引非 NULL
key_len索引長度越短越好 (滿足區分度前提)
rows預估掃描行數越少越好
Extra額外信息避免 Using filesort、Using temporary;期望 Using index (覆蓋索引)

優化器限制與繞過

  • 隱式類型轉換導致索引失效:WHERE varchar_col = 123 → 改 WHERE varchar_col = '123'
  • 函數/運算在索引列上:WHERE YEAR(date_col)=2023 → 改 WHERE date_col >= '2023-01-01' AND date_col < '2024-01-01'
  • LIKE '%abc%' 導致全掃 → 全文索引或應用層搜尋引擎
  • ANALYZE TABLE 更新統計信息,幫助優化器做更好決策
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved