索引加速讀取,但每次 INSERT/UPDATE/DELETE 都需同步維護所有索引,增加寫入負擔。頁面已滿時插入還會觸發頁面分裂產生碎片。唯有「查詢效能優於寫入效能」的欄位才值得建索引。
LIKE '%xxx%' 除外)。建立索引後,SQL Server 會建立統計資料。查詢優化器根據預估回傳列數佔表總列數比例決定是否使用索引:
-- 建立測試資料:2000 列,1999 列 ForumID=2,1 列 ForumID=3
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM Posts WHERE ForumID = 2; -- 未使用索引 (Clustered Index Scan)
SELECT * FROM Posts WHERE ForumID = 3; -- 使用索引 (Index Seek)
大批量 INSERT/UPDATE/DELETE 前:刪除索引 → 異動資料 → 重建索引,避免逐筆維護索引開銷。
INDEX (ThreadID, ForumID) → WHERE ThreadID=10 使用索引;WHERE ForumID=2 不使用。| 決策點 | 行動 |
|---|---|
| 欄位出現在 WHERE/JOIN/ORDER BY? | 是 → 候選索引欄位 |
| 選擇性高 (唯一值多)? | 是 → 單欄索引佳;否 → 評估複合索引或放棄 |
| 表大 / 查詢頻繁? | 是 → 索引收益大 |
| 寫入頻繁? | 是 → 謹慎建立、考慮填充因子、批次重建 |
| 複合索引第一欄是否在查詢條件? | 否 → 索引無效,調整順序或拆分 |