微軟官網上的解釋:數據結構
索引是與表或視圖關聯的磁盤上結構,能夠加快從表或視圖中檢索行的速度。 索引包含由表或視圖中的一列或多列生成的鍵。 這些鍵存儲在一個結構(B 樹)中,使 SQL Server 能夠快速有效地查找與鍵值關聯的行。指針
表或視圖能夠包含如下類型的索引:排序
彙集索引
彙集索引根據數據行的鍵值在表或視圖中排序和存儲這些數據行。 索引定義中包含彙集索引列。 每一個表只能有一個彙集索引,由於數據行自己只能按一個順序存儲。
只有當表包含彙集索引時,表中的數據行才按排序順序存儲。 若是表具備彙集索引,則該表稱爲彙集表。 若是表沒有彙集索引,則其數據行存儲在一個稱爲堆的無序結構中。
非彙集二叉樹
非彙集索引具備獨立於數據行的結構。 非彙集索引包含非彙集索引鍵值,而且每一個鍵值項都有指向包含該鍵值的數據行的指針。方法
從非彙集索引中的索引行指向數據行的指針稱爲行定位器。 行定位器的結構取決於數據頁是存儲在堆中仍是彙集表中。 對於堆,行定位器是指向行的指針。 對於彙集表,行定位器是彙集索引鍵。數據
能夠向非彙集索引的葉級添加非鍵列以跳過現有的索引鍵限制,並執行完整範圍內的索引查詢。查詢
彙集索引和非彙集索引均可以是惟一的。 這意味着任何兩行都不能有相同的索引鍵值。 另外,索引也能夠不是惟一的,即多行能夠共享同一鍵值。英文
實際上,能夠把索引理解爲一種特殊的目錄。微軟的SQL SERVER提供了兩種索引:彙集索引(clustered index,也稱聚類索引、簇集索引)和非彙集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,咱們舉例來講明一下彙集索引和非彙集索引的區別:時間
其實,咱們的漢語字典的正文自己就是一個彙集索引。好比,咱們要查「安」字,由於「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文字母「a」開頭並以「z」結尾的,那麼「安」字就天然地排在字典的前部。若是您翻完了全部以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字。也就是說,字典的正文部分自己就是一個目錄,您不須要再去查其餘目錄來找到您須要找的內容。咱們把這種正文內容自己就是一種按照必定規則排列的目錄稱爲「彙集索引」。
若是遇到不認識的字,不知道它的發音,這時候,須要去根據「偏旁部首」查到您要找的字,而後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並非真正的正文的排序方法,好比您查「張」字,咱們能夠看到在查部首以後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼倒是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並非真正的分別位於「張」字的上下方,如今您看到的連續的「馳、張、弩」三字實際上就是他們在非彙集索引中的排序,是字典正文中的字在非彙集索引中的映射。咱們能夠經過這種方式來找到您所須要的字,但它須要兩個過程,先找到目錄中的結果,而後再翻到您所須要的頁碼。咱們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱爲「非彙集索引」。
經過以上例子,咱們能夠理解到什麼是「彙集索引」和「非彙集索引」。進一步引伸一下,咱們能夠很容易的理解:每一個表只能有一個彙集索引,由於目錄只能按照一種方法進行排序。
區別:
彙集索引一個表只能有一個,而非彙集索引一個表能夠存在多個
彙集索引存儲記錄是物理上連續存在,而非彙集索引是邏輯上的連續,物理存儲並不連續
彙集索引:物理存儲按照索引排序;彙集索引是一種索引組織形式,索引的鍵值邏輯順序決定了表數據行的物理存儲順序。
非彙集索引:物理存儲不按照索引排序;非彙集索引則就是普通索引了,僅僅只是對數據列建立相應的索引,不影響整個表的物理存儲順序。
索引是經過二叉樹的數據結構來描述的,咱們能夠這麼理解聚簇索引:索引的葉節點就是數據節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
優點與缺點:
彙集索引插入數據時速度要慢(時間花費在「物理存儲的排序」上,也就是首先要找到位置而後插入),查詢數據比非彙集數據的速度快。
使用匯集索引來查找數據時,由於彙集索引創建是有順序的,因此查詢時要按照彙集索引的前後順序來進行查詢