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

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

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