索引是關聯式資料庫提升查詢效能的核心機制。本文系統整理叢集/非叢集索引特性、適用場景判斷表、十大建立原則、建立與刪除語法,並說明複合索引欄位順序的關鍵影響。
| 特性 | 叢集索引 | 非叢集索引 |
|---|---|---|
| 資料物理儲存順序 | 與索引鍵值順序完全一致(連續) | 邏輯順序連續,物理順序不連續 |
| 每張表上限 | 1 個(資料本身即索引) | 多個(SQL Server 最多 999) |
| 葉層結構 | 資料頁本身 | 索引鍵值 + 書籤(RID 或叢集鍵) |
| 查詢回表 | 無需回表 | 可能需回表(書籤查閱) |
| 場景 | 叢集索引 | 非叢集索引 |
|---|---|---|
| 外鍵欄位 | ✓ | ✓ |
| 主鍵欄位 | ✓ | ✓ |
| 常用於 ORDER BY/GROUP BY 排序分組 | ✓ | ✓ |
| 範圍查詢(BETWEEN, >, < 等) | ✓ | ✗ |
| 低基數(少數不同值,如性別、狀態) | ✓ | ✗ |
| 高基數(大量不同值,如身分證、流水號) | ✗ | ✓ |
| 頻繁 UPDATE 的欄位 | ✗ | ✓ |
| 頻繁修改索引鍵值 | ✗ | ✓ |
| 極低基數(1 或極少不同值) | ✗ | ✗ |
註:主鍵預設建立叢集索引,但可依查詢模式調整(如主鍵為 UUID 時,改用代理鍵做叢集索引)。
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON {table_name | view_name} (column [ASC | DESC] [, ...n])
[WITH (index_property [, ...n])]
UNIQUE:唯一性約束。CLUSTERED:叢集索引(每表僅一)。NONCLUSTERED:非叢集索引(預設)。index_property:FILLFACTOR、PAD_INDEX、IGNORE_DUP_KEY 等。UNIQUE 索引可為叢集或非叢集,未指定時預設非叢集。
DROP INDEX table_name.index_name [, table_name.index_name ...]
EXEC sp_helpindex 'table_name';
查詢模式:WHERE dept_id = ? AND hire_date BETWEEN ? AND ? ORDER BY salary DESC
CREATE NONCLUSTERED INDEX idx_emp_dept_hire_sal ON employee (dept_id ASC, hire_date ASC, salary DESC);
順序原則:等值比較欄位 → 範圍欄位 → 排序欄位。若順序改為 (hire_date, dept_id, salary),等值條件 dept_id 不在最左,索引將無法有效求值。