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

SQL Server 索引結構與實戰 (一) : 深入淺出聚集/非聚集索引、選擇誤區與實測數據

     編輯:關於SqlServer

一、索引 = 特殊目錄:聚集 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 秒 = 全表掃描)。
  • **鐵律:前導欄位必須是最頻繁查詢欄位**;全用上且結果少 → 索引覆蓋 → 極致效能。

四、其他書上沒有的實測經驗

  1. 聚集索引查詢比非聚集主鍵快 ~25%。
  2. 聚集索引 ORDER BY 比主鍵快 ~30% (小資料量差距巨大,大資料量趨同)。
  3. 聚集索引時間區間查詢耗時**與結果集佔總表比例線性相關** (100萬→6.3s, 50萬→3.2s, 單日→3.3s)。
  4. 日期含秒級精度**不降低查詢速度** (50萬筆 5000 不同日期 vs 50萬筆 2 個日期,排序耗時 6.3s vs 6.4s)。

五、索引也是雙面刃

過多/不當索引 → **寫入開銷大增、索引碎片、優化器選擇困擾**。**建立「適當」索引體系,特別是聚集索引,須精益求精、多方案實測**。

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