1. 程式人生 > >【轉】聚簇索引與非聚簇索引的區別

【轉】聚簇索引與非聚簇索引的區別

聚集 lin 處理 更新 檢查 ref 末尾 滿足 實現

通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有數據的快速存取。事實上,如果索引策略和數據檢索需求嚴重不符的話,建立索引反而會降低查詢性能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁盤空間的開銷及處理開銷(如資源競爭和加鎖)。例如,如果數據頻繁的更新或刪加,就不宜建立索引。

本文簡要討論一下聚簇索引的特點及其與非聚簇索引的區別。
  • 建立索引:
在SQL語言中,建立聚簇索引使用CREATE INDEX語句,格式為:CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,...);
  • 存儲特點:
  1. 聚集索引。表數據按照索引的順序來存儲的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,葉子結點即存儲了真實的數據行,不再有另外單獨的數據頁。 在一張表上最多只能創建一個聚集索引,因為真實數據的物理順序只能有一種。
  2. 非聚集索引。表數據存儲順序與索引順序無關。對於非聚集索引,葉結點包含索引字段值及指向數據頁數據行的邏輯指針,其行數量與數據表行數據量一致。
總結一下:聚集索引是一種稀疏索引,數據頁上一級的索引頁存儲的是頁指針,而不是行指針。而對於非聚集索引,則是密集索引,在數據頁的上一級索引頁它為每一個數據行存儲一條索引記錄。
  • 更新表數據
1、向表中插入新數據行
如果一張表沒有聚集索引,那麽它被稱為“堆集”(Heap)。這樣的表中的數據行沒有特定的順序,所有的新行將被添加到表的末尾位置。而建立了聚簇索引的數據表則不同:最簡單的情況下,插入操作根據索引找到對應的數據頁,然後通過挪動已有的記錄為新數據騰出空間,最後插入數據。如果數據頁已滿,則需要拆分數據頁,調整索引指針(且如果表還有非聚集索引,還需要更新這些索引指向新的數據頁)。而類似於自增列為聚集索引的,數據庫系統可能並不拆分數據頁,而只是簡單的新添數據頁。

2、從表中刪除數據行

對刪除數據行來說:刪除行將導致其下方的數據行向上移動以填充刪除記錄造成的空白。如果刪除的行是該數據頁中的最後一行,那麽該數據頁將被回收,相應的索引頁中的記錄將被刪除。對於數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的“索引合並”。

聚簇索引確定表中數據的物理順序。聚簇索引類似於電話簿,後者按姓氏排列數據。由於聚簇索引規定數據在表中的物理存 儲順序,因此一個表只能包含一個聚簇索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。漢語字典也是聚簇索引的典型應用, 在漢語字典裏,索引項是字母+聲調,字典正文也是按照先字母再聲調的順序排列。

聚簇索引對於那些經常要搜索範圍值的列特別有效。使用聚簇索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程序執行的一個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的性能。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則可以將該表在該列上聚簇(物理排序),避免每次查詢該列時都進行排序,從而節省成本。

建立聚簇索引的思想

1、大多數表都應該有聚簇索引或使用分區來降低對表尾頁的競爭,在一個高事務的環境中,對最後一頁的封鎖嚴重影響系統的吞吐量。 2、在聚簇索引下,數據在物理上按順序排在數據頁上,重復值也排在一起,因而在那些包含範圍檢查 (between、<、<=、>、>=)或使用group by或orderby的查詢時,一旦找到具有範圍中第一個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜索,避免了大範圍掃描,可以大 大提高查詢速度。 3、在一個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上升值的列(如IDENTITY)上,否則會經常引起封鎖沖突。 4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,數據行必須移動到新的位置。 5、選擇聚簇索引應基於where子句和連接操作的類型。
不知從什麽角度來對比,只能說說各自的特點,希望對你有用。
1、聚簇索引
a) 一個索引項直接對應實際數據記錄的存儲頁,可謂“直達”
b) 主鍵缺省使用它
c) 索引項的排序和數據行的存儲排序完全一致,利用這一點,想修改數據的存儲順序,可以通過改變主鍵的方法(撤銷原有主鍵,另找也能滿足主鍵要求的一個字段或一組字段,重建主鍵)
d) 一個表只能有一個聚簇索引(理由:數據一旦存儲,順序只能有一種)

2、非聚簇索引
a) 不能“直達”,可能鏈式地訪問多級頁表後,才能定位到數據頁
b) 一個表可以有多個非聚簇索引
from:http://www.cnblogs.com/Alight/p/3967141.html

【轉】聚簇索引與非聚簇索引的區別