通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷(如資源競爭和加鎖)。例如,如果資料頻繁的更新或刪加,就不宜建立索引。
本文 簡要討論一下聚簇索引的特點及其與非聚簇索引的區別。
在sql語言中,建立聚簇索引使用create index語句,格式為:create cluster index index_name on table_name(column_name1,column_name2,...);
聚集索引。表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,葉子結點即儲存了真實的資料行,不再有另外單獨的資料頁。
在一張表上最多只能建立乙個聚集索引,因為真實資料的物理順序只能有一種。
非聚集索引。表資料儲存順序與索引順序無關。對於非聚集索引,葉結點包含索引字段值及指向資料頁資料行的邏輯指標,其行數量與資料表行資料量一致。
總結一下:
聚集索引是一種稀疏索引,資料頁上一級的索引頁儲存的是頁指標,而不是行指標。而對於非聚集索引,則是密集索引,在資料頁的上一級索引頁它為每乙個資料行儲存一條索引記錄。
1、向表中插入新資料行
如果一張表沒有聚集索引,那麼它被稱為
「堆集」(
heap)。這樣的表中的資料行沒有特定的順序,所有的新行將被新增到表的末尾位置。
而建立了聚簇索引的資料表則不同:最簡單的情況下,
插入操作根據索引找到對應的資料頁,然後通過挪動已有的記錄為新資料騰出空間,最後插入資料。如果資料頁已滿,則需要拆分資料頁,調整索引指標(且如果表還有非聚集索引,還需要更新這些索引指向新的資料頁
)。而類似於自增列為聚集索引的,資料庫系統可能並不拆分資料頁,而只是簡單的新添資料頁。
2、從表中刪除資料行
對刪除資料行來說:刪除行將導致其下方的資料行向上移動以填充刪除記錄造成的空白。如果刪除的行是該資料頁中的最後一行,那麼該資料頁將被**,相應的索引頁中的記錄將被刪除。對於資料的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被**,即所謂的「索引合併」。
聚集索引、非聚集索引
什麼是聚集索引??
漢語字典的正文本身就是乙個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文本母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。
什麼是非聚集索引??
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。
聚簇索引與非聚簇索引區別
聚集索引與非聚集索引的區別是 葉節點是否存放一整行記錄 innodb 主鍵使用的是聚簇索引,myisam 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。下圖形象說明了聚簇索引表 innodb 和非聚簇索引 myisam 的區別 聚簇索引與非聚簇索引 1.對於非聚簇索引表來說 右圖 表資料和索引是...
聚簇索引與非聚簇索引
聚簇索引介紹 聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。具體的細節依賴於實現方式,例innodb的聚簇索引實際上在同乙個結構中儲存了b tree索引和資料行。當表有聚簇索引時,他的資料行實際放在索引的葉子頁 leaf page 術語 聚簇 聚簇索引實現 儲存引擎負責實現索引,因此不是所...
聚簇索引與非聚簇索引
mysql的索引主要使用b 樹和雜湊索引的方式進行組織。雜湊索引底層即是雜湊表,查詢時只需要進行一次雜湊操作即可得到位址,查詢速度比較快,但是查詢時操作只適合 的查詢操作,對於範圍查詢不友好,因此只適用於大多數需求為單錶查詢的情況。mysql中常用的兩大引擎myisam和innodb 對於b 樹的使...