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

MySQL 索引核心原理與 15 個必知必會的實戰問題

     編輯:MySQL 資料庫相關知識

索引基礎認知

1. 索引是做什麼的?

索引是幫助 MySQL 高效獲取資料的資料結構。沒有索引時,MySQL 需全表掃描;有索引時,可透過 B+ 樹快速定位到資料頁,大幅降低磁碟 I/O。常見索引類型:

  • B+ 樹索引:PRIMARY KEY、UNIQUE、INDEX、FULLTEXT(大多數引擎)
  • R 樹索引:空間資料類型
  • Hash 索引:MEMORY 引擎支援

2. 形象比喻:字典與目錄

資料 = 書的正文,CPU = 你,索引 = 書的目錄。要找「一」字開頭的成語,查目錄(索引)比翻全書(全表掃描)快得多。

3. 索引越多越好?

錯誤觀念! 三大代價:

  • 寫入效能下降:INSERT/UPDATE/DELETE 需同步維護所有索引
  • 佔用空間:一本 100 頁的書卻有 50 頁目錄?
  • 小表反而更慢:讀 2 頁宣傳單還要先找目錄?優化器可能選擇全表掃描

索引設計實戰準則

4. 字段類型限制

  • TEXT/BLOB 可建索引,但必須指定前綴長度
  • MyISAM 單索引鍵長度總和 ≤ 1000 bytes
  • 查詢值類型必須與索引列一致,避免隱式轉換導致索引失效

5. LIKE 查詢與索引的關係

同理:<, <=, =, >, >=, BETWEEN, IN 可用索引;<>, !=, NOT IN 通常不可用。

6. 不適合建索引的場景

  • 低基數列:性別、狀態、類型等(重複值超過 15% 通常不建)
  • 超長字段:用前綴索引(如 INDEX(name(10)))
  • 高頻更新列:維護成本過大

7. 單次查詢只能用一個索引

MySQL 5.6+ 引入 Index Condition Pushdown (ICP) 優化,但本質上仍是單索引掃描。

8. 多列查詢如何建索引?

核心原則:區分度高的列放前面。

  • 方案 A:單列索引 a、b —— 優化器只會選一個
  • 方案 B:聯合索引 (a,b) 或 (b,a) —— 區分度高者優先

9. 聯合索引最左前綴原理

INDEX(a,b,c)
WHERE a = 1           ✅ 用到索引
WHERE a = 1 AND b = 2 ✅ 用到索引
WHERE b = 2           ❌ 無法用到(非最左列)
WHERE a = 1 AND c = 3 ✅ 部分用到(僅 a)

有 (a,b) 通常不需再建單獨 (a)。

10. 導致索引失效的常見寫法

  • LIKE '%xxx'
  • NOT IN, !=, <>
  • 列上做函數/運算:WHERE MD5(pwd) = 'xxx'
  • WHERE idx=1 OR col=10(OR 兩側需都有索引)
  • 字符串列存數值卻不加引號:WHERE mobile = 13800000000 → 隱式轉換,索引失效
⚠️ 手機號請用 CHAR(11) 存儲,切勿用 INT(會丟失前導 0 且超出範圍)。

11. 覆蓋索引 —— 效能殺手鐧

查詢只需掃描索引樹即可獲取所有所需列,避免回表。
實踐: SELECT id, name FROM t WHERE age > 20 若有 INDEX(age, id, name) 即為覆蓋索引。
禁忌: 無必要勿用 SELECT *。

12. NULL 與索引

NULL 會導致索引統計不準、篩選複雜。建議:NOT NULL + 預設值(如 -1、空字串)替代。

13. 索引分析神器

SHOW INDEX FROM tbl;
EXPLAIN SELECT ...;  -- 重點看 type、key、rows、Extra

善用 EXPLAIN 判斷是否走索引、是否發生 Using filesort/Using temporary。

14. 切勿過早優化

幾千筆資料的新聞表,每天幾百次全文搜尋,LIKE '%kw%' 完全能抗住,別上來就架 Elasticsearch。

15. 實戰案例:30 分鐘解決生產環境死效能

某中小企業官網(日 PV 2-3 萬),獨立伺服器,資料量 < 100 MB,頁面打不開。
外包報價 2 萬優化,DBA 花 20 分鐘給高頻查詢欄位加索引,世界安靜了。

16. 永遠記住:SQL 注入防範

參數化查詢、預編譯語句、最小權限原則——索引再好,安全漏洞一個就能毀了系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式能否用索引說明
xxx%✅ 是前綴匹配,利用 B+ 樹有序性
%xxx / %xxx%❌ 否前導通配符,無法利用索引順序