聚集索引與非聚集索引

     聚集索引就是存放的物理順序和列中的順序一樣。一般設置主鍵索引就爲聚集索引。

     一個沒加主鍵的表,它的數據無序的放置在磁盤存儲器上,一行一行的排列的很整齊。如果給表上了主鍵,那麼表在磁盤上的存儲結構就由整齊排列的結構轉變成了樹狀結構,也就是平衡樹結構,換句話說,就是整個表就變成了一個索引,也就是所謂的聚集索引。 這就是爲什麼一個表只能有一個主鍵, 一個表只能有一個聚集索引,因爲主鍵的作用就是把表的數據格式轉換成索引(平衡樹)的格式放置。

     上圖就是帶有主鍵的表(聚集索引)的結構圖。其中樹的所有結點(底部除外)的數據都是由主鍵字段中的數據構成,也就是通常我們指定主鍵的id字段。最下面部分是真正表中的數據。 假如我們執行一個SQL語句:

select * from table where id = 1256

     首先根據索引定位到1256這個值所在的葉結點,然後再通過葉結點取到id等於1256的數據行。 這裏不講解平衡樹的運行細節, 但是從上圖能看出,樹一共有三層, 從根節點至葉節點只需要經過三次查找就能得到結果。如下圖


     然而, 事物都是有兩面的, 索引能讓數據庫查詢數據的速度上升, 而使寫入數據的速度下降,原因很簡單的, 因爲平衡樹這個結構必須一直維持在一個正確的狀態, 增刪改數據都會改變平衡樹各節點中的索引數據內容,破壞樹結構, 因此,在每次數據改變時, DBMS必須去重新梳理樹(索引)的結構以確保它的正確,這會帶來不小的性能開銷,也就是爲什麼索引會給查詢以外的操作帶來副作用的原因。

    講完聚集索引 , 接下來聊一下非聚集索引, 也就是我們平時經常提起和使用的常規索引。

    非聚集索引和聚集索引一樣, 同樣是採用平衡樹作爲索引的數據結構。索引樹結構中各節點的值來自於表中的索引字段, 假如給user表的name字段加上索引 , 那麼索引就是由name字段中的值構成,在數據改變時, DBMS需要一直維護索引結構的正確性。如果給表中多個字段加上索引 , 那麼就會出現多個獨立的索引結構,每個索引(非聚集索引)互相之間不存在關聯。 如下圖


     每次給字段建一個新索引, 字段中的數據就會被複制一份出來, 用於生成索引。 因此, 給表添加索引,會增加表的體積, 佔用磁盤存儲空間。

  非聚集索引和聚集索引的區別在於:

     通過聚集索引可以一次查到需要查找的數據, 而通過非聚集索引第一次只能查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數據。

     聚集索引一張表只能有一個,而非聚集索引一張表可以有多個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章