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

SQL 索引優化實戰:WHERE 條件 + ORDER BY 排序的最佳索引策略

     編輯:關於SqlServer

場景

SELECT * FROM [user] WHERE gender = '1' ORDER BY id DESC;

三種索引方案對比

方案索引定義執行計畫特徵適用性
1. 單欄 gender`CREATE INDEX IX_user_gender ON [user](gender);`Index Seek (gender) → Key Lookup → Sort (id DESC)gender 選擇性高 (如男/女各 50%),且需排序額外成本可接受
2. 單欄 id`CREATE INDEX IX_user_id ON [user](id DESC);`Index Scan (id DESC) → Filter (gender='1')全表掃描成本高,通常最差
3. 複合索引 (gender, id)`CREATE INDEX IX_user_gender_id ON [user](gender, id DESC);`Index Seek (gender) → **有序輸出 id DESC,無需 Sort**最佳:覆蓋 WHERE + ORDER BY,避免排序與 Key Lookup (若 INCLUDE 其餘欄位)

實測數據 (7 萬列,取前 100 列)

  • 方案 1 (gender 索引):**0.07 秒** (Index Seek + Sort)
  • 方案 2 (id 索引):**0.2+ 秒** (Index Scan + Filter)
  • 方案 3 (gender, id DESC):**最快**,無排序操作符,邏輯讀最少。

核心原則

  1. 等值條件欄位優先:複合索引首欄放 `WHERE` 等值比較欄位 (`gender`)。
  2. 排序欄位次之:`ORDER BY` 欄位放第二 (`id DESC`),且順序一致 (DESC/ASC)。
  3. 覆蓋索引:若查詢 `SELECT *`,考慮 `INCLUDE` 其餘熱點欄位消除 Key Lookup;若僅需少數欄位,直接列入索引鍵或 INCLUDE。
  4. 選擇性評估:若 `gender` 選擇性極低 (如 99% 為 '1'),優化器可能放棄索引改用掃描;此時需檢視統計資料或加入篩選索引 `WHERE gender='1'`。

進階:篩選索引 (Filtered Index) SQL 2008+

CREATE INDEX IX_user_gender1_id ON [user](id DESC) WHERE gender = '1';
  • 體積更小、維護成本更低、專門服務高頻查詢。
  • 查詢需精確匹配 `WHERE gender = '1'` 才能使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved