萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 索引建立策略深度解析:何時建立、何時避免、如何驗證有效性

索引的核心價值

  • 提升資料檢索效率(B+ Tree 結構)
  • 降低 IO 成本(減少全表掃描)
  • 降低排序/分組成本(ORDER BY、GROUP BY 利用索引有序性)

何時應該建立索引?

✅ 高頻查詢條件欄位

分析所有 SQL,出現在 WHERE、JOIN ON、ORDER BY、GROUP BY 中頻率最高的欄位優先建立索引。

✅ 高選擇性欄位

選擇性 = COUNT(DISTINCT column) / COUNT(*)。越接近 1 越適合建立索引(如身分證字號、手機號、UUID)。

✅ 多欄位組合查詢

經常同時出現的欄位組合(如 WHERE a=1 AND b=2、WHERE a=1 ORDER BY b)建立複合索引,遵循最左前綴原則。

何時不應建立索引?

❌ 低選擇性欄位(狀態、類型、性別、布林值)

如 status IN (0,1,2)、gender IN ('M','F')。索引掃描會導致大量隨機 IO,反而比全表掃描慢。

❌ 高頻更新欄位

每次 UPDATE 都需維護索引結構。若「查詢:更新」比例低於 10:1,建議不建索引。

❌ 不出現在查詢條件的欄位

僅出現在 SELECT 清單中的欄位無需索引(覆蓋索引除外)。

❌ 小表(< 1 萬行)

全表掃描成本極低,索引維護成本反而更高。

MySQL 使用索引的條件

  • 比較運算子:=, >, >=, <, <=, IS NULL, BETWEEN, IN
  • LIKE 'prefix%'(不以萬用字元開頭)
  • JOIN 條件欄位類型、長度一致
  • MAX()/MIN() 配合 WHERE 條件
  • ORDER BY/GROUP BY 符合最左前綴
  • 覆蓋索引:查詢欄位全包含於索引中

MySQL 不使用索引的情況

  • 優化器判斷全表掃描更快(如篩選度 > 20-30%)
  • LIKE '%keyword%'(前導萬用字元)
  • 隱含轉型:WHERE varchar_col = 123(需加引號)
  • 函數運算:WHERE DATE(created_at) = '2023-01-01'(應改用範圍查詢)
  • 複合索引未遵循最左前綴
  • OR 條件兩側索引不一致

驗證索引有效性

  1. EXPLAIN SELECT ... 檢查 type(目標:ref, range, eq_ref)、key、rows
  2. 對比執行時間:SET profiling=1; SELECT ...; SHOW PROFILES;
  3. SHOW INDEX FROM table 檢查基數
  4. 使用 mysqlslap 或 sysbench 壓測驗證

實戰建議清單

  1. 啟用 innodb_buffer_pool_size 容納熱點索引(建議 70-80% 實體記憶體)
  2. 定期 ANALYZE TABLE 更新統計資訊
  3. 單表索引數量建議 ≤ 5 個,避免過度索引
  4. 避免重疊索引(如 INDEX(a) + INDEX(a,b))
  5. 使用 pt-duplicate-key-checker 檢測重複/冗餘索引
copyright © 萬盛學電腦網 all rights reserved