sqlServer-索引
在關系型數據庫中,索引是一種單獨的,物理的對數據庫表中一列或多列的值進行排序的一種存儲結構。
索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
當表中有大量記錄時,若要對表進行查詢,
第一種搜索信息方式是全表搜索,就是將所有記錄一一取出,然後和查詢條件一一進行對比,返回滿足條件的記錄。但是這樣做會消耗大量的數據庫系統時間,並造成大量磁盤I/O操作
第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄
索引是為了加速對表中數據行的檢索而創建的一種分散的存儲結構。它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。
索引的作用
1、快速取數據
2、保證數據記錄的唯一性
3、實現表與表之間的參照完整性
4、在使用order by、group by子句進行檢索時,利用索引可以減少排序和分組的時間
優點
1、大大加快索引的檢索速度
2、創建唯一性索引,保證數據庫表中每一行數據的唯一性
3、加速表與表之間的連接
4、在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
缺點
1、索引需要占用物理空間
2、當對表中的數據進行增刪改操作時,索引也要動態的維護,降低了數據的維護速度
索引類型
無論是聚集索引還是非聚集索引,都是將信息存儲在平衡樹或B-樹中。B-樹將具有類似鍵的記錄組合起來,正是由於B-樹中的檢索基於鍵值,因此索引可以提升數據訪問的速度
聚集索引
每張表或者視圖只能包含一個聚集索引,這是因為聚集索引改變了數據存儲和排列的方式
在B-樹中,每一頁被稱為一個節點,每個索引均有單獨的一個根節點,也就是檢索開始的地方
每個索引行中包含一個鍵值與一個指針,這些鍵值即在創建索引時所包含的列,而指針則是樹中各層之間的連接,指針可以指向中間層,也可以指向葉節點。指針指向何處取決於所銀行的大小與表中行的數量
如果創建了一個很大聚集索引,包含許多鍵列,那麽一頁中能夠包含的鍵將更少,從而使得頁的數量增加,而且層級也將更多。
建議選擇較小的鍵值範圍,從而盡可能減少中間層的頁數。因此,在創建聚集索引時,整型是不錯的選擇,尤其在使用標識列時
不包含聚集索引的表被稱為堆。存儲在堆中的數據沒有進行任何有序的組織,因為返回數據的速度較慢。
建議為數據庫的所有表均添加一個合適的聚集索引
非聚集索引
結構與聚集索引結構類似,也有根與葉節點層。但是,非聚集索引中的葉節點包含的是索引行而非數據行,該索引為指向數據行的標簽。
而在聚集索引中,葉節點包含的是數據行,由於非聚集索引中不包含任何數據,所以它對數據的儲存和排序不會產生任何影響。因此在單張表上可以有多個非聚集索引
列存儲結構
該功能只能在sql server企業版中可用,傳統索引將數據行存儲在連續的頁中,而列存儲索引每次對一列的數據進行分組並連續地存儲在頁面集合中。
該結構並未將全部數據存儲在同一結構中,而是把數據水平分成若幹個行組,這在一個列存儲結構中被稱作段,一個段包含每行指定列的所有值,段又被分成不同的行組,具有相同行集的段被存儲在一個行組中。
只要一張表中有列存儲索引,就不能更新這張表。所以, 列存儲結構一般只用於數據倉庫中
sqlServer-索引