聚集索引與非聚集索引

2021-07-07 03:19:22 字數 3197 閱讀 6571

一、聚集索引概念

漢語字典的正文本身就是乙個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文本母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。

每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。

二、非聚集索引概念

如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼

我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」

三、區別

聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致

聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。

聚集索引的缺點是對錶進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到資料頁的相應位置,必須在資料頁中進行資料重排,降低了執行速度

建議使用聚集索引的場合:

a.此列包含有限數目的不同值; 

b.查詢的結果返回乙個區間的值;

c.查詢的結果返回某值相同的大量結果集。

非聚集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,聚集索引和非聚集索引都採用了b+樹的結構,但非聚集索引的葉子層並不與實際的資料頁相重疊,而採用葉子層包含乙個指向表中的記錄在資料頁中的指標的方式。非聚集索引比聚集索引層次多新增記錄不會引起資料順序的重組

建議使用非聚集索引的場合為:

a.此列包含了大量數目不同的值; 

b.查詢的結束返回的是少量的結果集;

c.order by 子句中使用了該列。

聚集索引:物理儲存按照索引排序

非聚集索引:物理儲存不按照索引排序

補充:

1、聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個。

2、聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續。

但何為邏輯連續和物理儲存聯絡呢。

其實上面的我們需要搞清楚以下幾個問題:

第一:聚集索引的約束是唯一性,是否要求欄位也是唯一的呢?

分析:一般我們指定乙個表的主鍵,如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,sql會預設在此字段上建立乙個聚集索引,而主鍵都是唯一的,所以理所當然的認為建立聚集索引的字段也需要唯一。

結論:聚集索引可以建立在任何一列你想建立的字段上,這是從理論上講,實際情況並不能隨便指定,否則在效能上會是惡夢。

第二:為什麼聚集索引可以建立在任何一列上,如果此表沒有主鍵約束,即有可能存在重複行資料呢?

粗一看,這還真是和聚集索引的約束相背,但實際情況真可以建立聚集索引。

分析其原因是:如果未使用 unique 屬性建立聚集索引,資料庫引擎將向表自動新增乙個四位元組 uniqueifier 列。必要時,資料庫引擎將向行自動新增乙個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,使用者不能檢視或訪問。

第三:是不是聚集索引就一定要比非聚集索引效能優呢?

如果想查詢學分在60-90之間的學生的學分以及姓名,在學分上建立聚集索引是否是最優的呢?

答:否。既然只輸出兩列,我們可以在學分以及學生姓名上建立聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所儲存的內容就是最終輸出的資料,這種索引在比以學分為聚集索引做查詢效能更好。

第四:在資料庫中通過什麼描述聚集索引與非聚集索引的?

索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的資料節點,而非聚集索引的葉節仍然是索引節點,但它有乙個指向最終資料的指標。!!!!

第五:在主鍵是建立聚集索引的表在資料插入上為什麼比主鍵上建立非聚集索引表速度要慢?

有了上面第四點的認識,我們分析這個問題就有把握了,在有主鍵的表中插入資料行,由於有主鍵唯一性的約束,所以需要保證插入的資料沒有重複。我們來比較下主鍵為聚集索引和非聚集索引的查詢情況:聚集索引由於索引葉節點就是資料頁,所以如果想檢查主鍵的唯一性,需要遍歷所有資料節點才行,但非聚集索引不同,由於非聚集索引上已經包含了主鍵值,所以查詢主鍵唯一性,只需要遍歷所有的索引頁就行(索引的儲存空間比實際資料要少),這比遍歷所有資料行減少了不少io消耗。這就是為什麼主鍵上建立非聚集索引比主鍵上建立聚集索引在插入資料時要快的真正原因。

聚集索引與非聚集索引

非聚集索引也是堆結構?其實sqlserver有幾種頁面型別 資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的 感興趣的朋友可以了解下,希望本文可以增加你們對非聚集索引結構的理解。我們知道sqlserver的資料行的儲存有兩種資料結構 a 堆b b樹 binary 二叉樹 資料...

聚集索引與非聚集索引

1 聚集索引 聚集索引的意思可以理解為順序排列,比如乙個主鍵自增的錶即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條.假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的位址加上100即為第一百條的位址,一次就能查詢出來。因為資料庫中的資料只...

聚集索引與非聚集索引

1 3點 聚集索引和非聚集索引簡單了解 4 5點是細節點 聚集索引 定義 資料行的物理順序和列值 一般是主鍵的那一列 的邏輯順序相同 理解 乙個表就像是我們以前用的新華字典,聚集索引就像是拼音目錄。我們如果要查詢乙個 哇 字,我們只需要查詢 哇 字對應在新華字典拼音目錄對應的頁碼,就可以查詢到對應的...