聚簇索引和非聚簇索引都是為了增加資料檢索速度而存在的.
在配置上, 每個表只能有一個聚簇索引,而能有200多個非聚簇索引。
在物理分配上, 每個表的資料都是分配在頁上,一個頁大概有8k左右,假設一條資料佔1000位元組的話,那麼8000條資料佔8000*1k/8k = 1000頁面,這些資料存在於資料區塊中。
如果對這些資料中的某一10位元組的欄位做聚簇索引的話,8000 * 0.01K /8 = 10 頁面,那麼10頁面作為儲存這些索引而存在。並存放於索引塊
如果對這些資料中的某一10位元組的欄位做非聚簇索引的話,2 * 8000 * 0.01K /8 = 20 頁面,那麼20頁面作為儲存這些索引而存在。並存放於索引塊。乘2 的原因請看以下敘述。
在功能上, 聚簇索引後,資料按照索引的順序來排序,所以索引所指向的就是資料層裡對應的相關資料。
非聚簇索引後,資料不會按照索引的順序來排序,所以資料庫會先按字理或邏輯先產生首層索引, 再根據首層索引產生第二層索引,第二層索引
所指向的才是資料層裡對應的相關資料。
在效能上, 聚簇索引在大多數的情況下對該索引的查詢操作效能是最好的,查詢先通過索引層(按上述的例子中,最多需要搜尋10頁)找到對應資料存在位置,就算是多條符合記錄的資料,也是在旁邊的資料位元置中就能找到
非聚簇索引在大多數的情況下對該索引的查詢操作效能比聚簇索引稍次,查詢也先通過首層索引(按上述的例子中,最多搜尋10頁)找到對應第二層索引存在位置,由第二層索引層再找到資料的物理位置。
索引雖然可以增加查詢速度,但也有以下缺陷,需要在設定時注意
1. 佔用空間,雖然索引塊增長速度不如資料區塊那麼急劇,但畢竟也是消耗空間的。
2. 在select * 的訪問語句時, 資料庫會先搜尋聚簇和非聚簇索引的索引塊的索引,再搜尋資料區塊,這種情況下表裡完全不設索引的效能高於設了聚簇索引的效能(按上例要額外搜尋10個頁),設了聚簇的效能比設非聚簇的要好(按上例非聚簇要額外搜尋20個頁)