聚簇索引與非聚簇索引的區別

2022-04-03 17:27:58 字數 2181 閱讀 5407

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

本文簡要討論一下聚簇索引的特點及其與非聚簇索引的區別。

在sql語言中,建立聚簇索引使用create index語句,格式為:create cluster index index_name on table_name(column_name1,column_name2,...);

聚集索引。表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,葉子結點即儲存了真實的資料行,不再有另外單獨的資料頁。 在一張表上最多只能建立乙個聚集索引,因為真實資料的物理順序只能有一種。

非聚集索引。表資料儲存順序與索引順序無關。對於非聚集索引,葉結點包含索引字段值及指向資料頁資料行的邏輯指標,其行數量與資料表行資料量一致。

總結一下:聚集索引是一種稀疏索引,資料頁上一級的索引頁儲存的是頁指標,而不是行指標。而對於非聚集索引,則是密集索引,在資料頁的上一級索引頁它為每乙個資料行儲存一條索引記錄。

1、向表中插入新資料行

如果一張表沒有聚集索引,那麼它被稱為「堆集」(heap)。這樣的表中的資料行沒有特定的順序,所有的新行將被新增到表的末尾位置。而建立了聚簇索引的資料表則不同:最簡單的情況下,插入操作根據索引找到對應的資料頁,然後通過挪動已有的記錄為新資料騰出空間,最後插入資料。如果資料頁已滿,則需要拆分資料頁,調整索引指標(且如果表還有非聚集索引,還需要更新這些索引指向新的資料頁)。而類似於自增列為聚集索引的,資料庫系統可能並不拆分資料頁,而只是簡單的新添資料頁。

2、從表中刪除資料行

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

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

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

1、大多數表都應該有聚簇索引或使用分割槽來降低對錶尾頁的競爭,在乙個高事務的環境中,對最後一頁的封鎖嚴重影響系統的吞吐量。

2、在聚簇索引下,資料在物理上按順序排在資料頁上,重複值也排在一起,因而在那些包含範圍檢查 (between、<、<=、>、>=)或使用group by或orderby的查詢時,一旦找到具有範圍中第乙個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜尋,避免了大範圍掃瞄,可以大 大提高查詢速度。

3、在乙個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上公升值的列(如identity)上,否則會經常引起封鎖衝突。

4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,資料行必須移動到新的位置。

5、選擇聚簇索引應基於where子句和連線操作的型別。

不知從什麼角度來對比,只能說說各自的特點,希望對你有用。

1、聚簇索引

a) 乙個索引項直接對應實際資料記錄的儲存頁,可謂「直達」

b) 主鍵預設使用它

c) 索引項的排序和資料行的儲存排序完全一致,利用這一點,想修改資料的儲存順序,可以通過改變主鍵的方法(撤銷原有主鍵,另找也能滿足主鍵要求的乙個欄位或一組字段,重建主鍵)

d) 乙個表只能有乙個聚簇索引(理由:資料一旦儲存,順序只能有一種)

2、非聚簇索引

a) 不能「直達」,可能鏈式地訪問多級頁表後,才能定位到資料頁

b) 乙個表可以有多個非聚簇索引

聚簇索引與非聚簇索引區別

聚集索引與非聚集索引的區別是 葉節點是否存放一整行記錄 innodb 主鍵使用的是聚簇索引,myisam 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。下圖形象說明了聚簇索引表 innodb 和非聚簇索引 myisam 的區別 聚簇索引與非聚簇索引 1.對於非聚簇索引表來說 右圖 表資料和索引是...

聚簇索引與非聚簇索引

聚簇索引介紹 聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。具體的細節依賴於實現方式,例innodb的聚簇索引實際上在同乙個結構中儲存了b tree索引和資料行。當表有聚簇索引時,他的資料行實際放在索引的葉子頁 leaf page 術語 聚簇 聚簇索引實現 儲存引擎負責實現索引,因此不是所...

聚簇索引與非聚簇索引

mysql的索引主要使用b 樹和雜湊索引的方式進行組織。雜湊索引底層即是雜湊表,查詢時只需要進行一次雜湊操作即可得到位址,查詢速度比較快,但是查詢時操作只適合 的查詢操作,對於範圍查詢不友好,因此只適用於大多數需求為單錶查詢的情況。mysql中常用的兩大引擎myisam和innodb 對於b 樹的使...