2. ?????? 什么是聚集索引
2.1 ?????????? 聚集 索引 定義
聚集索引是根據(jù)數(shù)據(jù)行的鍵值在表中排序存儲數(shù)據(jù)行。索引定義中包含聚集索引列。每個表只能有一個聚集索引。只有當表包含聚集索引時,表中的數(shù)據(jù)行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其數(shù)據(jù)行存儲在一個稱為堆的無序結(jié)構(gòu)中。
2.2 ?????????? 聚集索引的結(jié)構(gòu)
對于某個聚集索引,索引指向該聚集索引某個特定分區(qū)(數(shù)據(jù)頁)的頂部。 SQL Server 將在索引中向下移動以查找與某個聚集索引鍵對應(yīng)的行。原因是聚集索引的索引順序就是數(shù)據(jù)排列順序。

1.1 ?????????? 聚集索引與查詢操作
如上圖,在建立聚集索引后,當需要在根據(jù)此字段查找特定的記錄時,數(shù)據(jù)庫系統(tǒng)會根據(jù)特定的系統(tǒng)表查找的此索引的根,然后根據(jù)指針查找下一個,直到找到。數(shù)據(jù)查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次 IO 操作。在索引表中找到所需數(shù)據(jù)索引值后,就可以確定目標數(shù)據(jù)行所在的數(shù)據(jù)位置,從而讀取數(shù)據(jù)。
1.2 ?????????? 聚集索引與插入和刪除操作
插入數(shù)據(jù)時,首先根據(jù)索引找到對應(yīng)的數(shù)據(jù)頁,然后通過挪動已有的記錄為新數(shù)據(jù)騰出空間,最后插入數(shù)據(jù)。
刪除數(shù)據(jù)時將導(dǎo)致其下方的數(shù)據(jù)行向上移動以填充刪除記錄造成的空白。
對于數(shù)據(jù)的刪除操作,可能導(dǎo)致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的“索引合并”。同樣插入數(shù)據(jù)頁會更改索引。每一次索引更改都是一次 IO 操作。
聚集索引的建立會降低數(shù)據(jù)插入和刪除的效率。
2. ?????? 什么是非聚集索引
2.1 ?????????? 非聚集索引定義
非聚集索引并不是在物理上排列數(shù)據(jù) , 即索引中的邏輯順序并不等同于表中行的物理順序 , 索引是指向表中行的位置的指針 , 這些指針本身是有序的 , 通過這些指針可以在表中快速定位數(shù)據(jù)。
?
2.2 ?????????? 非聚集索引的結(jié)構(gòu)
由于非聚集索引數(shù)據(jù)存儲時無序的,所以在非聚集索引中指針包含數(shù)據(jù)行在數(shù)據(jù)頁中的偏移量。即指針由 數(shù)據(jù)頁 + 數(shù)據(jù)行偏移量 組成。
?
1.1 ?????????? 非聚集索引的查詢
如上圖,在建立非聚集索引后,當需要在根據(jù)此字段查找特定的記錄時,數(shù)據(jù)庫系統(tǒng)會根據(jù)特定的系統(tǒng)表查找的此索引的根,然后根據(jù)指針查找,直到找到。數(shù)據(jù)查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次 IO 操作。在索引表中找到所需數(shù)據(jù)索引值后,就可以確定目標數(shù)據(jù)行所在的數(shù)據(jù)位置,從而讀取數(shù)據(jù)。
1.2 ?????????? 非聚集索引的插入刪除
如果一張表包含一個非聚集索引但沒有聚集索引,則新的數(shù)據(jù)將被插入到最末一個數(shù)據(jù)頁中,然后非聚集索引將被更新。如果也包含聚集索引,該聚集索引將被用于查找新行將要處于什么位置,隨后,聚集索引、以及非聚集索引將被更新。
如果在刪除命令的 Where 子句中包含的列上,建有非聚集索引,那么該非聚集索引將被用于查找數(shù)據(jù)行的位置,數(shù)據(jù)刪除之后,位于索引葉子上的對應(yīng)記錄也將被刪除。如果該表上有其它非聚集索引,則它們?nèi)~子結(jié)點上的相應(yīng)數(shù)據(jù)也要刪除。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
