原文:http://www.cnblogs.com/mybluesky99/archive/2011/04/21/2023629.html
以下為整理的幾個主要問題
主要有以下兩個區別:
- 聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個
- 聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲並不連續
問題:
1. 聚集索引的約束是唯一性,是否要求字段也是唯一的呢?
從理論上講,聚集索引可以創建在任何一列你想創建的字段上,實際情況並不能隨便指定,否則在性能上會是惡夢。
2. 是不是聚集索引就一定要比非聚集索引性能優呢?
如果想查詢學分在60-90之間的學生的學分以及姓名,在學分上創建聚集索引是否是最優的呢?
答:否。既然只輸出兩列,我們可以在學分以及學生姓名上創建聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所存儲的內容就是最終輸出的數據,這種索引在比以學分為聚集索引做查詢性能更好。
3. 在數據庫中通過什么描述聚集索引與非聚集索引的?
索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的數據節點,而非聚集索引的葉節仍然是索引節點,但它有一個指向最終數據的指針。
4. 在主鍵是創建聚集索引的表在數據插入上為什么比主鍵上創建非聚集索引表速度要慢?
在有主鍵的表中插入數據行,由於有主鍵唯一性的約束,所以需要保證插入的數據沒有重復。我們來比較下主鍵為聚集索引和非聚集索引的查找情況:聚集索引由於索引葉節點就是數據頁,所以如果想檢查主鍵的唯一性,需要遍歷所有數據節點才行,但非聚集索引不同,由於非聚集索引上已經包含了主鍵值,所以查找主鍵唯一性,只需要遍歷所有的索引頁就行,這比遍歷所有數據行減少了不少IO消耗。這就是為什么主鍵上創建非聚集索引比主鍵上創建聚集索引在插入數據時要快的真正原因。