介紹:
查詢資料表中的行的兩種方式,不管聚集索引,還是非聚集索引,都是用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 開頭的部分仍然找不到這個字,那麼就說明您的...