聚集索引與非聚集索引 SQL

2021-06-01 06:06:38 字數 1571 閱讀 5503

介紹:

查詢資料表中的行的兩種方式,不管聚集索引,還是非聚集索引,都是用b+樹來實現的,關於b樹的介紹

clustered index(聚集索引):類似於使用字典的拼音索引來找字

表必須按順序排列,聚集索引的葉節點就是實際的資料頁,每一頁為乙個頁節點,訪問資料時表得保持順序故會減低速度,每個表只能有乙個聚集索引,聚集索引的平均大小大約為表大小的5%左右,查詢速度快,修改速度慢(為保持索引與資料順序一致)

下圖為執行:select * from table where firstname = 'ota'的過程

從根節點root開始,找到下乙個節點的指標page145,在節點page145再找到下乙個節點的指標page120,到達葉子節點(必須到達葉子節點),資料必定在這裡,如果不在那麼該表中就沒有該資料

關於sysindexes

sysindexes 為一張表在資料庫(每個資料庫一張)中為每個索引與表生成一行,該行的值表示該錶或索引的屬性

indid表示:索引 id:

0 = 堆

1 = 聚集索引

> 1 = 非聚集索引

nonclustered index(非聚集索引):類似於使用字典的「部首目錄」和「檢字表」來找字

與聚集索相比只是多了一張位址表(必須的兩列:一列記錄關鍵碼即要查詢的關鍵字,第二列記錄該關鍵字在原表中的位置位址),該位址表必須安順序排列,下圖的leaf level 即為位址表,heap為原表

下圖為執行:select * from table where firstname = 'matey' or firstname = 'ota' or firstname = 'phua' or firstname = 'rudd' 的過程

上部分過程一樣只是到了葉子節點後還繼續,根據表中的位址訪問其在原表中的位置

補充:

對於那些經常要搜尋範圍值的列特別有效

查詢特定的行也很有效率

含有大量非重複值的列。

使用between,>,>=,《或<=返回乙個範圍值的列

被連續訪問的列

返回大型結果集的查詢

經常被使用連線或group by子句的查詢訪問的列

下面的表總結了何時使用聚集索引或非聚集索引(很重要):

動作描述

使用聚集索引

使用非聚集索引

列經常被分組排序應應

返回某範圍內的資料應不應

乙個或極少不同值

不應不應

小數目的不同值應不應

大數目的不同值不應應

頻繁更新的列不應應

外來鍵列應

應主鍵列應應

頻繁修改索引列不應應

SQL聚集與非聚集索引

索引是在資料庫表或者檢視上建立的物件,目的是為了加快對錶或檢視的查詢的速度 按照儲存方式分為 聚集與非聚集索引 按照維護與管理索引角度分為 唯一索引 復合索引和系統自動建立的索引 索引的結構是由 根節點 非葉節點 非葉節點 葉節點 1 聚集索引 表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高...

聚集索引與非聚集索引

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

聚集索引與非聚集索引

一 聚集索引概念 漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安 的拼音是 an 而按照拼音排序漢字的字典是以英文本母 a 開頭並以 z 結尾的,那麼 安 字就自然地排在字典的前部。如果您翻完了所有以 a 開頭的部分仍然找不到這個字,那麼就說明您的...