聚集索引與非聚集索引的根本區別是表記錄的物理排序順序和索引的排序順序是否一致。其主要區別有以下幾點:
-
聚集索引一個表只能有一個,非聚集索引一個表可以存在多個。
-
聚集索引存儲記錄是物理上連續存在,物理存儲按照索引排序;而非聚集索引是邏輯上的連續,物理存儲並不連續,物理存儲不按照索引排序。
-
聚集索引查詢數據比非聚集索引速度快,插入數據速度慢(時間花費在「物理存儲的排序」上,也就是首先要找到位置然後插入);非聚集索引反之。
-
索引是通過B+Tree的結構來描述的,聚集索引的葉節點就是數據節點,而非聚集索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
聚集索引和非聚集索引的使用場景 |
||
動作描述 |
聚集索引 |
非聚集索引 |
列經常被分組或排序 |
√ |
√ |
返回某範圍內的數據 |
√ |
✘ |
一個或極少不同值 |
✘ |
✘ |
小數目的不同值 |
√ |
✘ |
大數目的不同值 |
✘ |
√ |
頻繁更新的列 |
✘ |
√ |
外鍵列 |
√ |
√ |
主鍵列 |
√ |
√ |
頻繁修改索引列 |
✘ |
√ |