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

深入淺出 SQL Server 聚集索引與非聚集索引:原理、選型與實戰誤區

     編輯:關於SqlServer

核心概念對照

特性聚集索引非聚集索引
資料儲存順序葉節點即資料頁,邏輯順序 = 物理順序葉節點為索引頁,含指標指向資料列 (RID 或叢集鍵)
每表數量僅 1 個最多 999 個 (SQL 2008+)
適合場景範圍查詢、頻繁排序、外鍵、主鍵精確查詢、覆蓋索引、高基數欄位
非聚集索引結構
圖 1:非聚集索引 B+ 樹結構
聚集索引結構
圖 2:聚集索引 B+ 樹結構 (葉節點即資料)

字典比喻:秒懂兩者差異

  • 聚集索引 = 字典正文:按拼音排序,查「安」直接翻前頁,查「張」翻後頁。正文本身就是目錄,一步到位。
  • 非聚集索引 = 部首檢字表:查不認識的字,先查部首得頁碼,再翻頁。需「查目錄 → 翻頁」兩步驟,目錄順序與正文順序不同。

因正文只能有一種排序,故每表僅能有一個聚集索引。

何時選用哪種索引(決策表)

動作描述聚集非聚集
欄位經常 GROUP BY / ORDER BY✓✓
返回範圍資料✓✗
極少或唯一值✗✗
少量不同值✓✗
大量不同值✗✓
頻繁 UPDATE 的欄位✗✓
外鍵欄位✓✓
主鍵欄位✓✓

三大實戰誤區與數據驗證

誤區 1:主鍵預設聚集 = 最佳選擇

測試環境:1000 萬筆資料,近 3 個月 25 萬筆。

索引策略查詢語句耗時
PK 聚集,無日期索引SELECT ... FROM tgongwen128 秒
PK 聚集 + 日期非聚集WHERE fariqi > DATEADD(day,-90,GETDATE())54 秒
日期欄位建聚集WHERE fariqi > DATEADD(day,-90,GETDATE())2.4 秒

結論: 業務查詢核心欄位(如日期)應建聚集索引,ID 身分識別列僅適合非聚集。

誤區 2:建立索引必定提升速度

同一查詢、同一欄位,聚集 vs 非聚集 差 22 倍。索引類型選擇比單純建索引更關鍵。

誤區 3:複合聚集索引隨意加欄位

測試複合聚集 (日期, 用戶名):

  • 僅用日期查:2.5 秒
  • 日期+用戶名:2.5 秒
  • 僅用用戶名:60 秒 (索引失效)

鐵律: 複合索引前導欄位必須為最高頻查詢欄位,否則索引對該查詢無效。

其他實戰經驗

  • 聚集索引比非聚集主鍵快 ~25%
  • 小資料量 ORDER BY 聚集索引快 30%+
  • 範圍查詢耗時與結果集佔比近似線性
  • 日期欄位含時分秒不影響聚集索引效能

避坑指南

  1. 聚集索引極其寶貴,務必給範圍查詢核心欄位(通常是日期)
  2. 主鍵改用非聚集,避免浪費聚集資源
  3. 複合索引前導欄位 = 業務最高頻篩選欄位
  4. 定期 DBCC SHOWCONTIG 檢查碎片,必要時 REBUILD
  5. 「水能載舟亦能覆舟」—— 過多索引拖慢寫入、產生碎片
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved