漢語字典正文本身就是叢集索引。查「安」字,拼音「an」屬於「a」開頭,自然翻閱前頁;查「張」字則翻至末尾。正文內容依拼音排序,資料本身即有序存儲,無需額外目錄。每張表只能有一個叢集索引,因為資料只能依一種規則物理排序。
不認識字音時,需查「部首目錄」→「檢字表」獲取頁碼 → 翻頁找字。檢字表中「馳、張、弩」連續排列,但實際頁碼分別為 63、672、390,索引順序與資料物理順序完全分離。查詢需兩步驟:先查索引取得指標,再定位資料。
| 操作場景 | 叢集索引 | 非叢集索引 |
|---|---|---|
| 欄位常用於 GROUP BY / ORDER BY | ✓ 適合 | ✓ 適合 |
| 範圍查詢(BETWEEN、>、<) | ✓ 適合 | ✗ 不適合 |
| 極少唯一值(如性別) | ✗ 不適合 | ✗ 不適合 |
| 少量唯一值 | ✓ 適合 | ✗ 不適合 |
| 大量唯一值 | ✗ 不適合 | ✓ 適合 |
| 頻繁更新的欄位 | ✗ 不適合 | ✓ 適合 |
| 外鍵欄位 | ✓ 適合 | ✓ 適合 |
| 主鍵欄位 | ✓ 適合 | ✓ 適合 |
| 頻繁修改索引鍵值 | ✗ 不適合 | ✓ 適合 |
| 索引策略 | 查詢語句 | 耗時 |
|---|---|---|
| 僅主鍵叢集索引,無時間範圍 | SELECT gid,fariqi,neibuyonghu,title FROM tgongwen | 128,470 ms (128 秒) |
| 主鍵叢集 + 日期非叢集索引 | SELECT ... WHERE fariqi > DATEADD(day,-90,GETDATE()) | 53,763 ms (54 秒) |
| 日期欄位建叢集索引 | SELECT ... WHERE fariqi > DATEADD(day,-90,GETDATE()) | 2,423 ms (2 秒) |
DECLARE @d DATETIME SET @d = GETDATE()
-- 查詢語句 --
SELECT [執行耗時(ms)] = DATEDIFF(ms, @d, GETDATE())