索引是資料庫效能的靈魂。本文系統講解索引原理 (B+ 樹)、分類 (主鍵/唯一/普通/全文/空間/覆蓋/聯合)、設計原則 (最左前綴/區分度/覆蓋/回表)、維護操作 (創建/刪除/重建/統計更新)、效能調優 (EXPLAIN 分析/索引下推/條件下推/直方圖),並對比 MySQL/PostgreSQL/SQL Server/Oracle 差異。
| 類型 | 定義 | 適用場景 | 限制 |
|---|---|---|---|
| 主鍵索引 | PRIMARY KEY,唯一非空,聚簇索引 | 所有表必須有 (業務鍵或自增代理鍵) | 只能有一個 |
| 唯一索引 | UNIQUE KEY,允許一個 NULL | 業務唯一約束 (手機、郵箱、身份證) | 插入/更新需檢查唯一性 |
| 普通索引 | INDEX / KEY,無約束 | 高頻 WHERE/JOIN/ORDER BY/GROUP BY 欄位 | 維護開銷、佔用空間 |
| 聯合索引 | 多欄組合 (a,b,c) | 多欄組合查詢、排序、分組 | 遵循最左前綴 |
| 覆蓋索引 | 查詢列全在索引中 | 高頻 SELECT 少數列、避免回表 | 索引寬度大、寫入慢 |
| 全文索引 | FULLTEXT,分詞倒排 | 長文本模糊搜尋 (文章、日志、評論) | 中文需 ngram/ik 插件、5.6+ InnoDB 支援 |
| 空間索引 | SPATIAL,R 樹 | GIS 經緯度範圍、距離查詢 | 僅支援幾何類型 |
| 函數索引 | 索引表達式 (8.0.13+) | WHERE UPPER(name)='ABC' → 索引 (UPPER(name)) | 不支援外鍵引用 |
| 隱藏索引 | INVISIBLE (8.0+) | 驗證索引刪除影響、軟刪除 | 優化器忽略、需顯式 USE INDEX |
(a,b,c),查詢必須從 a 開始連續匹配。user_id > status),COUNT(DISTINCT col)/COUNT(*) > 0.1 為宜。SELECT a,b FROM t WHERE c=1 → 索引 (c,a,b),Using index。INDEX name_prefix (name(10)),節省空間但區分度下降,需計算最佳長度。-- 創建
CREATE INDEX idx_user_status ON users (status, created_at);
ALTER TABLE users ADD INDEX idx_user_status (status, created_at);
-- 刪除
DROP INDEX idx_user_status ON users;
ALTER TABLE users DROP INDEX idx_user_status;
-- 重建 (碎片整理、統計更新)
ANALYZE TABLE users; -- 更新統計信息
OPTIMIZE TABLE users; -- 重建表 (含索引)、釋放空間
ALTER TABLE users ENGINE=InnoDB; -- 在線重建 (5.6+)
-- 監控索引使用
SELECT * FROM sys.schema_unused_indexes; -- 未用索引 (sys schema)
SELECT * FROM sys.schema_redundant_indexes; -- 冗余索引
EXPLAIN 顯示 Using index condition。ANALYZE TABLE t UPDATE HISTOGRAM ON col WITH 100 BUCKETS; 讓優化器精準估算非均勻分佈列的選擇性。ALTER TABLE t ALTER INDEX idx INVISIBLE; 驗證刪除影響,無風險回滾。ALTER TABLE t ADD INDEX idx_upper_name ((UPPER(name))); 解決函數導致索引失效。SET SESSION max_parallel_workers_per_gather = 4; 大表掃描自動並行。| 特性 | MySQL (InnoDB) | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|
| 聚簇索引 | 主鍵強制聚簇 | 無 (堆表),可 CLUSTER 重排 | 主鍵默認聚簇,可指定非聚簇 | IOT (索引組織表) 可選 |
| 二級索引存儲 | 主鍵值 | CTID (物理行號) | Row Locator (RID/聚簇鍵) | ROWID |
| 全文索引 | ngram/ik 插件 | 內建 tsvector/gin | 內建 Full-Text Catalog | Oracle Text |
| 分區索引 | 本地/全局索引 | 分區表自動本地索引 | 對齊/非對齊索引 | 本地/全局索引 |
| 在線建索引 | 5.6+ 支援 | CONCURRENTLY | ONLINE=ON | ONLINE |
索引是「空間換時間、有序換無序」的藝術。掌握 B+ 樹原理 → 分類選型 → 設計法則 → 維護操作 → 進階特性 → 跨庫差異 全鏈路知識,配合 EXPLAIN、sys schema、Performance Schema 三大診斷工具,即可將索引從「玄學」變為「工程」。記住:**最好的索引是業務不需要的索引 (不建表)、其次是精準覆蓋業務查詢模式的最小索引集合。**