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

MySQL 索引深度解析:類型、限制、復合索引、全文索引與 EXPLAIN 優化

     編輯:MySQL 資料庫相關知識

索引本質

特殊文件(InnoDB 為表空間一部分),包含所有行的引用指針。B+ 樹結構存儲。

優缺點

  • ✅ 加速查詢
  • ❌ 寫入變慢(每修改必須刷新索引)
  • ❌ 佔磁盤空間
  • ❌ MySQL 單表索引上限 16 個
大量導入可用 DELAY_KEY_WRITE 延遲刷新,導入完畢再統一刷新。

InnoDB 索引特殊性

行級鎖基於索引實現。無合適索引時退化為表鎖,影響 SELECT ... LOCK IN SHARE MODE、FOR UPDATE、INSERT/UPDATE/DELETE 併發度。

索引無效的六大場景

  1. WHERE col != ... 不等號
  2. WHERE FUNC(col) = ... 函數運算
  3. JOIN 時主外鍵類型不一致
  4. LIKE '%abc' 以通配符開頭
  5. ORDER BY 條件非查詢條件表達式(多表時索引對排序無效)
  6. 列基數極低(如性別 0/1)

索引分類

類型關鍵字特點
普通索引KEY / INDEX純加速查詢,無唯一限制
唯一索引UNIQUE值唯一,寫入自動檢查重複
主鍵PRIMARY KEY特殊唯一索引,非空
外鍵索引FOREIGN KEY自動建立內部索引維護約束
復合索引INDEX(a,b,c)最左前綴原則:可服務 a、(a,b)、(a,b,c)
前綴索引INDEX(name(8))字串列取前 N 字符,縮小索引體積
全文索引FULLTEXT分詞倒排,支援 MATCH() AGAINST(),InnoDB 5.6+ 支援

復合索引最左前綴實例

INDEX(firstname, lastname, age)
-- 可用:firstname | firstname,lastname | firstname,lastname,age
-- 不可用:lastname | age | lastname,age

索引長度建議

  • 字串列:前 10~15 字符通常足夠區分
  • BLOB/TEXT 必須指定長度,上限 255 字符
  • 短鍵值優於長,整數優於字串
  • 有序鍵值(自增)優於隨機(UUID)

EXPLAIN 優化檢查點

  1. type:避免 ALL/index
  2. possible_keys vs key:實際用到索引
  3. key_len:越短越好
  4. rows:預估掃描行數
  5. Extra:紅燈 Using temporary/Using filesort,綠燈 Using index

維護命令

OPTIMIZE TABLE t;   -- 整理碎片、排序索引
ANALYZE TABLE t;    -- 更新統計信息
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved