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

MySQL 查詢優化核心技術:索引原理、建立策略與避坑指南

     編輯:MySQL 資料庫相關知識

為什麼索引是效能銀彈?

無索引表 = 無序資料堆,查詢需全表掃描(Full Table Scan)。百萬筆資料查 10 筆,掃描 100 萬列極其浪費。

索引 = 已排序的查找表,包含索引鍵值與指向資料列的指標。查詢變為:

  1. 二分搜尋/ B+ 樹遍歷定位首筆匹配(O(log n))。
  2. 順序讀取連續匹配列。
  3. 遇到不匹配值立即停止(因已排序)。

效能差異可達百倍以上。

索引類型與適用場景

類型關鍵字特性適用場景
主鍵PRIMARY KEY唯一、非空、叢集索引(InnoDB)每張表必備
唯一UNIQUE值唯一、允許 NULLEmail、身分證、業務鍵
普通INDEX / KEY允許重複、允許 NULLWHERE、JOIN、ORDER BY 常用欄位
全文FULLTEXT支援自然語言搜尋文章、商品描述搜尋
空間SPATIALGIS 幾何資料地理位置查詢
複合INDEX (a,b,c)最左前綴原則多欄位組合查詢

B+ 樹索引結構與叢集索引

  • InnoDB 叢集索引:主鍵即資料本身,葉節點存完整行資料。二級索引葉節點存主鍵值,查詢需「回表」查主鍵索引。
  • 覆蓋索引:查詢欄位全包含在二級索引中,避免回表,極大提升效能。
  • MyISAM 非叢集:主鍵與二級索引結構相同,葉節點存資料指標(檔案位移)。

建立索引黃金法則

  1. WHERE/JOIN/ORDER BY/GROUP BY 常用欄位優先建索引。
  2. 高選擇性(基數大)欄位優先;性別、狀態等低選擇性欄位單獨索引無效。
  3. 複合索引遵循最左前綴:INDEX (a,b,c) 支援 a、a,b、a,b,c,不支援 b、c、b,c。
  4. 避免過度索引:每個索引增加 INSERT/UPDATE/DELETE 成本,單表建議 ≤5 個索引。
  5. 字串索引指定前綴長度:INDEX (name(10)) 減少索引體積,適用長字串欄位。

導致索引失效的常見寫法(必避)

錯誤寫法原因正確寫法
WHERE YEAR(create_time) = 2024函數運算破壞索引順序WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'
WHERE name LIKE '%keyword%'前導萬用字元無法走索引全文索引或 LIKE 'keyword%'
WHERE varchar_col = 123隱含型別轉換WHERE varchar_col = '123'
WHERE a = 1 OR b = 2OR 兩側索引不同通常全掃拆分 UNION ALL 或重設計
SELECT * FROM t WHERE indexed_col > 100回表成本高,優化器選全掃覆蓋索引 SELECT indexed_col ... 或評估是否需全欄位

優化器與統計資訊

  • ANALYZE TABLE 更新統計資訊,幫助優化器做正確決策。
  • EXPLAIN SELECT ... 觀察 type(目標:ref/range/eq_ref)、key、rows、Extra(避免 Using temporary/filesort)。
  • OPTIMIZE TABLE 整理碎片、重建索引統計。

總結

索引是查詢優化的第一優先級。先建對索引、寫對 SQL 讓索引生效,再談分區、快取、讀寫分離等進階手段。定期 EXPLAIN 核心查詢,持續迭代索引設計。

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