叢集索引 - 資料即索引,索引即資料

結構特徵
- 資料頁 (8KB) 按鍵值物理有序儲存 (雙向鏈表串聯)。
- 索引樹葉層就是資料頁本身,非另存指標。
- 根節點 → 中間層 → 葉層 (資料頁) 形成 B+ 樹。
查找流程:尋找 LastName = 'Rudd'
- 從根節點 (Page 140) 開始,比較鍵值範圍。
- 'Rudd' > 'Martin' → 走右側指標到 Page 145。
- 'Rudd' < 'Smith' → 走左側指標到 Page 120 (葉層資料頁)。
- 在 Page 120 逐行掃描找到 'Rudd'。
無索引時需從第一頁順序掃描至目標頁,百萬列表效能差異指數級。
非叢集索引 - 索引與資料分離

結構特徵
- 資料頁物理順序無序,不依索引鍵排列。
- 索引樹葉層儲存 索引鍵值 + 書籤 (叢集索引鍵值 或 RID/Row Locator)。
- 每列資料在索引中有一份複製並排序。
查找流程:尋找 LastName = 'Rudd'
- 走索引樹 (Page 60 → Page 61) 找到鍵值 'Rudd',取得書籤
470501。
- 攜帶書籤到資料頁 (Page 5) 定位實際資料列 (Bookmark Lookup / Key Lookup)。
核心差異對照
| 特性 | 叢集索引 | 非叢集索引 |
| 資料物理順序 | 依鍵值有序 | 無序 |
| 葉層內容 | 完整資料列 | 索引鍵 + 書籤 |
| 每張表數量 | 最多 1 個 | 最多 999 個 (SQL 2008+) |
| 查找後是否需回表 | 否 (葉層即資料) | 是 (需 Key Lookup) |
| 適合場景 | 範圍查詢、排序、主鍵 | 點查詢、覆蓋索引、輔助查詢 |
實戰啟示
- 覆蓋索引:非叢集索引包含查詢所需所有欄位 (INCLUDE) → 避免 Key Lookup,效能逼近叢集索引。
- 叢集索引鍵選擇:宜窄、遞增、唯一 (Identity 最佳),因其值會複製到所有非叢集索引葉層作為書籤。
- 寫入代價:叢集索引插入可能導致頁面分裂;非叢集索引每新增一列需同步維護所有非叢集索引樹。
理解 B+ 樹結構與書籤查找機制,是索引調優從「背規則」進階到「懂原理」的關鍵門檻。