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

MySQL 索引必懂的 16 個核心問題:從原理、選型、聯合索引、覆蓋索引到 NULL 陷阱與防注入

     編輯:MySQL 綜合教學

MySQL 索引必懂的 16 個核心問題:從原理、選型、聯合索引、覆蓋索引到 NULL 陷阱與防注入

索引是查詢性能的倍增器,也是寫入性能的成本源。本文以問答形式,系統解答 16 個索引核心問題,覆蓋 B+ 樹原理、字段選型、Like 匹配邊界、聯合索引最左前綴、覆蓋索引、NULL 影響、SQL 注入防範,並附贈「板子 30 分鐘優化千萬級表」實戰案例。

一、 16 大核心問答

Q1: 索引是做什麼的?

快速定位行,避免全表掃描。MySQL 多數索引用 B+ 樹 存儲(空間索引用 R 樹,Memory 引擎支持 Hash)。

Q2: 如何形象理解索引?

數據 = 書正文,CPU = 你,索引 = 書的目錄。查目錄定頁碼,直接翻頁,不必逐頁翻閱。

Q3: 索引越多越好嗎?

不是。三大代價:
① 寫入維護成本(增刷改都要更新索引)。
② 空間佔用(100 頁正文卻有 50 頁目錄?)。
③ 小表建索引反而更慢(讀 2 頁宣傳冊還查目錄?)。

Q4: 索引字段類型注意點?

  • TEXT/BLOB 可建前綴索引(INDEX idx_content(content(100)))。
  • MyISAM 單索引鍵長 ≤ 1000 字節。
  • 查詢參數類型必須與索引列一致,隱式轉換導致索引失效。

Q5: LIKE 不能用索引?

前綴匹配可用:WHERE name LIKE 'abc%' 走索引。
通配符開頭不可用:LIKE '%abc'、LIKE '%abc%' 全表掃描。
類比:成語詞典按拼音排序,查「一*」極快,查「*一」或「*一*」必逐頁翻。

Q6: 還有哪些操作符能用索引?

<, <=, =, >, >=, BETWEEN, IN 可用。
<>, !=, NOT IN 通常不可用(全表掃描)。

Q7: 什麼字段不適合建索引?

  • 區分度極低:如性別、狀態(同值佔比 > 15% 無意義)。
  • 過長列:用前綴索引 INDEX idx_name(name(10))。
  • 極高頻更新列:維護成本超過查詢收益。

Q8: 一次查詢能用多個索引嗎?

MySQL 單表單次查詢只能用一個索引(Index Merge 例外但不可靠)。

Q9: 多列查詢如何建索引?

單索引不可行 → 必須聯合索引。
順序原則:區分度高(基數大)的列放前面。
如 WHERE a=1 AND b=2,若 a 基數大於 b,建 INDEX idx_ab(a,b)。

Q10: 聯合索引核心規則?

  • WHERE a=1 → 走 INDEX(a,b)(最左前綴)。
  • WHERE b=1 → 不走 (b 非最左)。
  • 有 (a,b) 通常無需再建 (a) 单列索引。

Q11: 哪些常見場景導致索引失效?

  1. LIKE '%abc'
  2. NOT IN, !=, <>
  3. 列上做函數運算:WHERE MD5(pwd)='...' → 改為應用層計算或函數索引(8.0+)。
  4. WHERE idx=1 OR a=10(OR 通常打破索引)。
  5. 數值型字符串列查詢丟引號:mobile=13711112222(隱式轉換),必須 mobile='13711112222'。

Q12: 覆蓋索引為何更高效?

索引葉子節點已包含所有查詢列,無需回表 查聚簇索引。
實踐:只 SELECT 需要的列,避免 SELECT * 破壞覆蓋。

Q13: NULL 對索引的影響?

NULL 會導致索引失效/統計失真。設計階段用 -1、0、''、'unknown' 等業務含義值替代 NULL,列定義 NOT NULL。

Q14: 如何查看/分析索引使用?

SHOW INDEX FROM tbl;
EXPLAIN SELECT ...;  -- 關注 type, possible_keys, key, key_len, rows, Extra

Q15: 了解系統,不要過早優化!

幾千條數據、幾百 QPS 的新聞表,LIKE '%keyword%' 完全夠用,別上全文搜索引擎。CPU 比人腦強太多,先跑起來再優化。

Q16: 永遠別忘的關鍵詞:SQL 注入

所有動態參數必須用預處理,佔位符綁定變量,拒絕字符串拼接。

二、 實戰案例:板子 30 分鐘優化千萬級表

  • 場景:中小企業站,獨立服務器,數據 100M,日 PV 2-3 萬,打開極慢。
  • 動作:分析慢查詢,給高頻 WHERE/ORDER BY 列加索引(約 10 個)。
  • 結果:世界安靜了,響應從秒級降至毫秒級。
  • 啟示:索引是性價比最高的優化手段,無需重構代碼、遷移架構。

索引設計是藝術,更是工程。掌握這 16 條,你已超越 80% 的開發者。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved