聚簇索引和非聚簇索引都是為了增加數據檢索速度而存在的.
在配置上, 每個表只能有一個聚簇索引,而能有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個頁)