數據庫索引技術-聚集索引和非聚集索引介紹(二)

2.       什麼是聚集索引

2.1           聚集索引定義

聚集索引是根據數據行的鍵值在表中排序存儲數據行。索引定義中包含聚集索引列。每個表只能有一個聚集索引。只有當表包含聚集索引時,表中的數據行才按排序順序存儲。如果表具有聚集索引,則該表稱爲聚集表。如果表沒有聚集索引,則其數據行存儲在一個稱爲堆的無序結構中。

2.2           聚集索引的結構

對於某個聚集索引,索引指向該聚集索引某個特定分區(數據頁)的頂部。SQL Server 將在索引中向下移動以查找與某個聚集索引鍵對應的行。原因是聚集索引的索引順序就是數據排列順序。

 

1.1           聚集索引與查詢操作

如上圖,在建立聚集索引後,當需要在根據此字段查找特定的記錄時,數據庫系統會根據特定的系統表查找的此索引的根,然後根據指針查找下一個,直到找到。數據查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需數據索引值後,就可以確定目標數據行所在的數據位置,從而讀取數據。

1.2           聚集索引與插入和刪除操作

插入數據時,首先根據索引找到對應的數據頁,然後通過挪動已有的記錄爲新數據騰出空間,最後插入數據。

刪除數據時將導致其下方的數據行向上移動以填充刪除記錄造成的空白。

對於數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的“索引合併”。同樣插入數據頁會更改索引。每一次索引更改都是一次IO操作。

聚集索引的建立會降低數據插入和刪除的效率。

2.       什麼是非聚集索引

2.1           非聚集索引定義

非聚集索引並不是在物理上排列數據,即索引中的邏輯順序並不等同於表中行的物理順序,索引是指向表中行的位置的指針,這些指針本身是有序的,通過這些指針可以在表中快速定位數據。

 

2.2           非聚集索引的結構

由於非聚集索引數據存儲時無序的,所以在非聚集索引中指針包含數據行在數據頁中的偏移量。即指針由 數據頁 + 數據行偏移量 組成。

 

1.1           非聚集索引的查詢

如上圖,在建立非聚集索引後,當需要在根據此字段查找特定的記錄時,數據庫系統會根據特定的系統表查找的此索引的根,然後根據指針查找,直到找到。數據查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需數據索引值後,就可以確定目標數據行所在的數據位置,從而讀取數據。

1.2           非聚集索引的插入刪除

如果一張表包含一個非聚集索引但沒有聚集索引,則新的數據將被插入到最末一個數據頁中,然後非聚集索引將被更新。如果也包含聚集索引,該聚集索引將被用於查找新行將要處於什麼位置,隨後,聚集索引、以及非聚集索引將被更新。

如果在刪除命令的Where子句中包含的列上,建有非聚集索引,那麼該非聚集索引將被用於查找數據行的位置,數據刪除之後,位於索引葉子上的對應記錄也將被刪除。如果該表上有其它非聚集索引,則它們葉子結點上的相應數據也要刪除。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章