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

SQL Server 索引運作原理圖解:叢集 vs 非叢集

     編輯:關於SqlServer

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

叢集索引 B+ 樹結構

結構特徵

  • 資料頁 (8KB) 按鍵值物理有序儲存 (雙向鏈表串聯)。
  • 索引樹葉層就是資料頁本身,非另存指標。
  • 根節點 → 中間層 → 葉層 (資料頁) 形成 B+ 樹。

查找流程:尋找 LastName = 'Rudd'

  1. 從根節點 (Page 140) 開始,比較鍵值範圍。
  2. 'Rudd' > 'Martin' → 走右側指標到 Page 145。
  3. 'Rudd' < 'Smith' → 走左側指標到 Page 120 (葉層資料頁)。
  4. 在 Page 120 逐行掃描找到 'Rudd'。

無索引時需從第一頁順序掃描至目標頁,百萬列表效能差異指數級。

非叢集索引 - 索引與資料分離

非叢集索引結構

結構特徵

  • 資料頁物理順序無序,不依索引鍵排列。
  • 索引樹葉層儲存 索引鍵值 + 書籤 (叢集索引鍵值 或 RID/Row Locator)。
  • 每列資料在索引中有一份複製並排序。

查找流程:尋找 LastName = 'Rudd'

  1. 走索引樹 (Page 60 → Page 61) 找到鍵值 'Rudd',取得書籤 470501。
  2. 攜帶書籤到資料頁 (Page 5) 定位實際資料列 (Bookmark Lookup / Key Lookup)。

核心差異對照

特性叢集索引非叢集索引
資料物理順序依鍵值有序無序
葉層內容完整資料列索引鍵 + 書籤
每張表數量最多 1 個最多 999 個 (SQL 2008+)
查找後是否需回表否 (葉層即資料)是 (需 Key Lookup)
適合場景範圍查詢、排序、主鍵點查詢、覆蓋索引、輔助查詢

實戰啟示

  • 覆蓋索引:非叢集索引包含查詢所需所有欄位 (INCLUDE) → 避免 Key Lookup,效能逼近叢集索引。
  • 叢集索引鍵選擇:宜窄、遞增、唯一 (Identity 最佳),因其值會複製到所有非叢集索引葉層作為書籤。
  • 寫入代價:叢集索引插入可能導致頁面分裂;非叢集索引每新增一列需同步維護所有非叢集索引樹。

理解 B+ 樹結構與書籤查找機制,是索引調優從「背規則」進階到「懂原理」的關鍵門檻。

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