一、索引 = 特殊目錄:聚集 vs 非聚集
- 聚集索引 = 字典正文: 內容本身按規則 (拼音) 排序。查「安」→ 自然翻前頁;查「張」→ 翻尾頁。**正文即目錄,無需二次查找**。
- 非聚集索引 = 部首檢字表: 目錄 (部首/筆畫) 與正文分離。查生字 → 查目錄得頁碼 → 翻頁。**兩步驟:目錄定位 + 書籤查找**。
**每表僅能有一個聚集索引** (正文只能按一種規則排序)。
二、何時用聚集 / 非聚集索引 (決策表)
| 動作描述 | 聚集 | 非聚集 |
| 欄位經常分組排序 | ✅ | ✅ |
| 返回某範圍資料 | ✅ | ❌ |
| 極少不同值 (如性別) | ❌ | ❌ |
| 少量不同值 (如部門) | ✅ | ❌ |
| 大量不同值 (如身分證號) | ❌ | ✅ |
| 頻繁更新的欄位 | ❌ | ✅ |
| 外鍵欄位 | ✅ | ✅ |
| 主鍵欄位 | ✅ | ✅ |
| 頻繁修改索引欄位 | ❌ | ✅ |
例:時間欄位建聚集索引 → 查詢 2004/1/1~10/1 只需定位首尾頁,**極快**;非聚集索引需逐筆書籤查找。
三、三大實戰誤區與真相 (百萬/千萬級實測)
誤區 1:主鍵預設聚集索引 = 浪費寶貴資源
- ID 為自增代理鍵,**業務查詢從不用 ID 篩選** → 聚集索引無查詢價值。
- 大量不同值不宜建聚集索引 (除非極少更新)。
- **實測 1,000 萬筆,近 3 個月 25 萬筆:**
(1) 僅 PK 聚集,不分時間:128 秒
(2) PK 聚集 + 日期非聚集:54 秒
(3) **日期建聚集索引:2 秒** (快 64 倍!)
誤區 2:建立索引就能提速?
- 同樣查詢、同樣欄位,**聚集 vs 非聚集 差 27 倍** (2秒 vs 54秒)。**索引類型選擇比是否建索引更關鍵**。
- 日期欄位 5,003 個不同值,**完美符合「少量不同值宜聚集」**。
誤區 3:複合聚集索引加欄位就能加速?
- 複合聚集索引
(fariqi, neibuyonghu):**僅用前導欄位 (日期) 查詢 = 用全複合索引速度** (2.5s)。
- **僅用非前導欄位 (用戶名) 查詢 → 索引完全失效** (60 秒 = 全表掃描)。
- **鐵律:前導欄位必須是最頻繁查詢欄位**;全用上且結果少 → 索引覆蓋 → 極致效能。
四、其他書上沒有的實測經驗
- 聚集索引查詢比非聚集主鍵快 ~25%。
- 聚集索引
ORDER BY 比主鍵快 ~30% (小資料量差距巨大,大資料量趨同)。
- 聚集索引時間區間查詢耗時**與結果集佔總表比例線性相關** (100萬→6.3s, 50萬→3.2s, 單日→3.3s)。
- 日期含秒級精度**不降低查詢速度** (50萬筆 5000 不同日期 vs 50萬筆 2 個日期,排序耗時 6.3s vs 6.4s)。
五、索引也是雙面刃
過多/不當索引 → **寫入開銷大增、索引碎片、優化器選擇困擾**。**建立「適當」索引體系,特別是聚集索引,須精益求精、多方案實測**。