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

MySQL 索引優化實戰:存儲分類、使用條件、失效場景與監控指標深度解析

     編輯:MySQL 綜合教學

MySQL 索引優化實戰百科:存儲架構、優化器決策邏輯、失效陷阱避坑與性能監控

索引是 SQL 優化的核心槓桿。本文系統整理 MyISAM/InnoDB 索引存儲差異、B+Tree/HASH 選擇、優化器使用條件、6 大經典失效場景、覆蓋索引最佳實踐、Handler 監控指標體驐。

一、索引存儲架構對比

引擎數據存儲索引存儲索引類型核心特征
MyISAM.MYD.MYI (獨立)B+Tree非聚簇,葉子節點存數據指針
InnoDB表空間 (.ibd/.ibdata)同表空間B+Tree聚簇索引:主鍵葉子存全行;二級索引葉子存主鍵
MEMORY內存內存Hash / B+TreeHash 僅支持等值,重啟丟失

前綴索引:CREATE INDEX idx_name ON tbl(col(4)) 截取前 4 字符,大幅縮小體積,適用高基數長列。

二、優化器使用索引的鐵律

  1. 條件中必須出現索引鍵 (WHERE/JOIN/ORDER BY/GROUP BY)
  2. 最左前綴原則:複合索引 (a,b,c) 僅 a、a,b、a,b,c 可用
  3. 索引列不可做函數/運算/隱式轉換

三、索引生效的 5 大典型場景

  1. 複合索引最左列出現在 WHERE
  2. LIKE 'prefix%' 右側通配符
  3. 全文索引 MATCH...AGAINST
  4. IS NULL 條件
  5. 覆蓋索引:Extra: Using index 避免回表

四、索引存在但失效的 6 大陷阱

#場景根因對策
1優化器選擇全表掃描掃描比例 > 30%、統計信息過期ANALYZE TABLE、FORCE INDEX
2MEMORY 表非等值查詢Hash 索引限制USING BTREE 或遷移 InnoDB
3OR 分割導致失效idx_col=1 OR non_idx=2拆分 UNION ALL、建組合索引
4非最左前綴INDEX(a,b) 查 b=1調整索引順序、補單列索引
5LIKE 左側通配符LIKE '%abc'全文索引、反轉存儲
6字符串隱式轉換str_col = 123參數綁定、強制轉字符串

五、覆蓋索引:避免回表的殺手鐧

-- 查詢 SELECT a,b FROM t WHERE a=1 AND b=2
-- 建立 INDEX(a,b,c) 即為覆蓋索引,Extra 顯示 Using index
-- 二級索引葉子已包含 a,b,c + 主鍵,無需回聚簇索引

六、Handler 監控指標:量化索引效果

SHOW STATUS LIKE 'Handler_read_%';
指標含義健康基準
Handler_read_key索引讀取次數高 = 好
Handler_read_rnd_next全表掃描次數高 = 差,需建索引
Handler_read_next範圍掃描次數正常
Handler_read_rnd排序/臨時表讀取高 = 文件排序

黃金比率:Handler_read_key / (Handler_read_key + Handler_read_rnd_next) > 90%

七、實戰優化清單

  1. 單表索引 ≤ 5
  2. 複合索引列序:高區分度 → 低,高頻 WHERE → 低
  3. 覆蓋索引優化核心查詢
  4. 消除冗余索引 (INDEX(a) + INDEX(a,b) → 保留後者)
  5. 定期 ANALYZE TABLE 更新統計信息
  6. 大表 DDL 用 pt-online-schema-change 無鎖變更
  7. 監控 Handler_read_rnd_next 暴增告警
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved