聚簇索引和非聚簇索引(通俗易懂 言簡意賅)

總結:InnoDB中,表數據文件自己就是按B+Tree組織的一個索引結構,聚簇索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的就是整張表的行記錄數據,也將彙集索引的葉子節點稱爲數據頁。這個特性決定了索引組織表中數據也是索引的一部分;html

  通常建表會用一個自增主鍵作聚簇索引,沒有的話MySQL會默認建立,可是這個主鍵若是更改代價較高,故建表時要考慮自增ID不能頻繁update這點。算法

  咱們平常工做中,根據實際狀況自行添加的索引都是輔助索引,輔助索引就是一個爲了需找主鍵索引的二級索引,如今找到主鍵索引再經過主鍵索引找數據;數據庫

 

本文連接:https://blog.csdn.net/lm1060891265/article/details/81482136
參考博客:http://www.admin10000.com/document/5372.html性能

聚簇索引並非一種單獨的索引類型,而是一種數據存儲方式。具體細節依賴於其實現方式。優化

MySQL數據庫中innodb存儲引擎,B+樹索引能夠分爲聚簇索引(也稱彙集索引,clustered index)和輔助索引(有時也稱非聚簇索引或二級索引,secondary index,non-clustered index)。這兩種索引內部都是B+樹,彙集索引的葉子節點存放着一整行的數據。spa

Innobd中的主鍵索引是一種聚簇索引,非聚簇索引都是輔助索引,像複合索引、前綴索引、惟一索引。.net

Innodb使用的是聚簇索引,MyISam使用的是非聚簇索引指針

聚簇索引(彙集索引)

  聚簇索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的就是整張表的行記錄數據,也將彙集索引的葉子節點稱爲數據頁。這個特性決定了索引組織表中數據也是索引的一部分,每張表只能擁有一個聚簇索引。htm

  Innodb經過主鍵彙集數據,若是沒有定義主鍵,innodb會選擇非空的惟一索引代替。若是沒有這樣的索引,innodb會隱式的定義一個主鍵來做爲聚簇索引。blog

聚簇索引的優缺點

  優勢:

    1.數據訪問更快,由於聚簇索引將索引和數據保存在同一個B+樹中,所以從聚簇索引中獲取數據比非聚簇索引更快

    2.聚簇索引對於主鍵的排序查找和範圍查找速度很是快
  缺點:

    1.插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,不然將會出現頁分裂,嚴重影響性能。所以,對於InnoDB表,咱們通常都會定義一個自增的ID列爲主鍵
    2.更新主鍵的代價很高,由於將會致使被更新的行移動。所以,對於InnoDB表,咱們通常定義主鍵爲不可更新。
    3.二級索引訪問須要兩次索引查找,第一次找到主鍵值,第二次根據主鍵值找到行數據。

輔助索引(非聚簇索引)

  在聚簇索引之上建立的索引稱之爲輔助索引,輔助索引訪問數據老是須要二次查找。輔助索引葉子節點存儲的再也不是行的物理位置,而是主鍵值。經過輔助索引首先找到的是主鍵值,再經過主鍵值找到數據行的數據頁,再經過數據頁中的Page Directory找到數據行。

  Innodb輔助索引的葉子節點並不包含行記錄的所有數據,葉子節點除了包含鍵值外,還包含了相應行數據的聚簇索引鍵。

  輔助索引的存在不影響數據在聚簇索引中的組織,因此一張表能夠有多個輔助索引。在innodb中有時也稱輔助索引爲二級索引。

 

 

  Innodb聚簇索引和MyIsam非聚簇索引的比較說明
  參考博客:https://www.cnblogs.com/zlcxbb/p/5757245.html

InnoDB索引實現

  InnoDB也使用B+Tree做爲索引結構,但具體實現方式卻與MyISAM大相徑庭.

  1)主鍵索引:

    MyISAM索引文件和數據文件是分離的索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件自己就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。

 

 

 

  (圖inndb主鍵索引)是InnoDB主索引(同時也是數據文件)的示意圖,能夠看到葉節點包含了完整的數據記錄。這種索引叫作彙集索引。由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形

2)InnoDB的輔助索引

   InnoDB的全部輔助索引都引用主鍵做爲data域。例如,下圖爲定義在Col3上的一個輔助索引:

 

 

 

  InnoDB 表是基於聚簇索引創建的。所以InnoDB 的索引能提供一種很是快速的主鍵查找性能。不過,它的輔助索引(Secondary Index, 也就是非主鍵索引)也會包含主鍵列,因此,若是主鍵定義的比較大,其餘索引也將很大。若是想在表上定義 、不少索引,則爭取儘可能把主鍵定義得小一些。InnoDB 不會壓縮索引。

  文字符的ASCII碼做爲比較準則。彙集索引這種實現方式使得按主鍵的搜索十分高效,可是輔助索引搜索須要檢索兩遍索引:首先檢索輔助索引得到主鍵,而後用主鍵到主索引中檢索得到記錄。

  不一樣存儲引擎的索引實現方式對於正確使用和優化索引都很是有幫助,例如知道了InnoDB的索引實現後,就很容易明白:

    一、爲何不建議使用過長的字段做爲主鍵,由於全部輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,

    二、用非單調的字段做爲主鍵在InnoDB中不是個好主意,由於InnoDB數據文件自己是一顆B+Tree,非單調的主鍵會形成在插入新記錄時數據文件爲了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段做爲主鍵則是一個很好的選擇。

  InnoDB使用的是聚簇索引,將主鍵組織到一棵B+樹中,而行數據就儲存在葉子節點上,若使用"where id = 14"這樣的條件查找主鍵,則按照B+樹的檢索算法便可查找到對應的葉節點,以後得到行數據。若對Name列進行條件搜索,則須要兩個步驟:第一步在輔助索引B+樹中檢索Name,到達其葉子節點獲取對應的主鍵。第二步使用主鍵在主索引B+樹種再執行一次B+樹檢索操做,最終到達葉子節點便可獲取整行數據。

 

 

MyISAM索引實現

MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址

1)主鍵索引:

MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。下圖是MyISAM主鍵索引的原理圖:

 

 

 

這裏設表一共有三列,假設咱們以Col1爲主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。能夠看出MyISAM的索引文件僅僅保存數據記錄的地址。

2)輔助索引(Secondary key)

在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是惟一的,而輔助索引的key能夠重複。若是咱們在Col2上創建一個輔助索引,則此索引的結構以下圖所示:

 

 

 

  一樣也是一顆B+Tree,data域保存數據記錄的地址。所以,MyISAM中索引檢索的算法爲首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,則取出其data域的值,而後以data域的值爲地址,讀取相應數據記錄。

MyISAM的索引方式也叫作「非彙集」的,之因此這麼稱呼是爲了與InnoDB的彙集索引區分。

 

  MyISM使用的是非聚簇索引,非聚簇索引的兩棵B+樹看上去沒什麼不一樣,節點的結構徹底一致只是存儲的內容不一樣而已,主鍵索引B+樹的節點存儲了主鍵,輔助鍵索引B+樹存儲了輔助鍵。表數據存儲在獨立的地方,這兩顆B+樹的葉子節點都使用一個地址指向真正的表數據,對於表數據來講,這兩個鍵沒有任何差異。因爲索引樹是獨立的,經過輔助鍵檢索無需訪問主鍵的索引樹。

爲了更形象說明這兩種索引的區別,咱們假想一個表以下圖存儲了4行數據。其中Id做爲主索引,Name做爲輔助索引。圖示清晰的顯示了聚簇索引和非聚簇索引的差別。

 

 

問題:主鍵索引是彙集索引仍是非彙集索引?

在Innodb下主鍵索引是彙集索引,在Myisam下主鍵索引是非彙集索引

 

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

聚簇索引的葉子節點存放的是主鍵值和數據行,支持覆蓋索引;二級索引的葉子節點存放的是主鍵值或指向數據行的指針。

因爲節子節點(數據頁)只能按照一顆B+樹排序,故一張表只能有一個聚簇索引。輔助索引的存在不影響聚簇索引中數據的組織,因此一張表能夠有多個輔助索引

注: 覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就可以取得,沒必要從數據表中讀取。也能夠稱之爲實現了索引覆蓋。 當一條查詢語句符合覆蓋索引條件時,MySQL只須要經過索引就能夠返回查詢所須要的數據,這樣避免了查到索引後再返回表操做,減小I/O提升效率。 如,表covering_index_sample中有一個普通索引 idx_key1_key2(key1,key2)。當咱們經過SQL語句:select key2 from covering_index_sample where key1 = ‘keytest’;的時候,就能夠經過覆蓋索引查詢,無需回表。

相關文章
相關標籤/搜索