一文看懂聚集索引和非聚集索引

2021-10-06 21:52:05 字數 2005 閱讀 5734

聚集索引是指資料庫錶行中資料的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能有乙個聚集索引,因為乙個表的物理順序只有一種情況,所以,對應的聚集索引只能有乙個。如果某索引不是聚集索引,則表中的行物理順序與索引順序不匹配,與非聚集索引相比,聚集索引有著更快的檢索速度。

注意:聚集索引也稱為聚簇索引(clustered index)

聚集索引確定表中資料的物理順序。聚集索引類似於字典,按字母排序,每個字母下有多個字(相當於資料列)。所以對於聚集索引,葉子結點即儲存了真實的資料行。所以通過聚集索引可以直接獲取到資料庫中的資料。

注意:一般建表的時候,資料庫就會為主鍵建立了聚簇索引

該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。

非聚集索引的葉層不包含資料頁, 葉結點包含索引字段值及指向資料頁資料行的邏輯指標(每個索引行包含非聚集鍵值以及乙個或多個行定位器,這些行定位器指向有該鍵值的資料行(如果索引不唯一,則可能是多行))。所以非聚集索引不能直接獲取到資料,需要通過定位器來獲取資料。

聚集索引適用情況

1、含有大量非重複值的列。

2、使用between,>,>=,《或<=返回乙個範圍值的列

3、被連續訪問的列

4、返回大型結果集的查詢

5、經常被使用連線或group by子句的查詢訪問的列

下面的表總結了何時使用聚集索引或非聚集索引:

接下來,我們來看一下mysql兩種儲存引擎的底層實現

myisam 引擎(非聚集索引方式)

myisam 用的是非聚集索引方式,即資料和索引落在不同的兩個檔案上。myisam 在建表時以主鍵作為 key 來建立主索引 b+樹,樹的葉子節點存的是對應資料的實體地址。我們拿到這個實體地址後,就可以到 myisam 資料檔案中直接定位到具體的資料記錄了。

當我們為某個字段新增索引時,我們同樣會生成對應欄位的索引樹,該字段的索引樹的葉子節點同樣是記錄了對應資料的實體地址,然後也是拿著這個實體地址去資料檔案裡定位到具體的資料記錄。

innodb 引擎(聚集索引方式)

innodb 是聚集索引方式,因此資料和索引都儲存在同乙個檔案裡。首先 innodb 會根據主鍵 id 作為 key 建立索引 b+樹,如左下圖所示,而 b+樹的葉子節點儲存的是主鍵 id 對應的資料,比如在執行 select * from user_info where id=15 這個語句時,innodb 就會查詢這顆主鍵 id 索引 b+樹,找到對應的 user_name=『bob』。

這是建表的時候 innodb 就會自動建立好主鍵 id 索引樹,這也是為什麼 mysql 在建表時要求必須指定主鍵的原因。當我們為表裡某個欄位加索引時 innodb 會怎麼建立索引樹呢?比如我們要給 user_name 這個欄位加索引,那麼 innodb 就會建立 user_name 索引 b+樹,節點裡存的是 user_name 這個 key,葉子節點儲存的資料的是主鍵 key。注意,葉子儲存的是主鍵 key!拿到主鍵 key 後,innodb 才會去主鍵索引樹里根據剛在 user_name 索引樹找到的主鍵 key 查詢到對應的資料。

問題來了,為什麼 innodb 只在主鍵索引樹的葉子節點儲存了具體資料,但是其他索引樹卻不存具體資料呢,而要多此一舉先找到主鍵,再在主鍵索引樹找到對應的資料呢?

其實很簡單,因為 innodb 需要節省儲存空間。乙個表裡可能有很多個索引,innodb 都會給每個加了索引的字段生成索引樹,如果每個欄位的索引樹都儲存了具體資料,那麼這個表的索引資料檔案就變得非常巨大(資料極度冗餘了)。從節約磁碟空間的角度來說,真的沒有必要每個字段索引樹都存具體資料,通過這種看似「多此一舉」的步驟,在犧牲較少查詢的效能下節省了巨大的磁碟空間,這是非常有值得的。

聚集索引和非聚集索引

聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...

聚集索引和非聚集索引

本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...

聚集索引和非聚集索引

聚集索引和非聚集索引 1 聚集索引 聚集索引,表中的資料儲存位置,根據索引的排序進行實際儲存,因此效率是相當高的。因為聚集索引決定了表中資料行的儲存位置。乙個表不可能有兩個或以上的聚集索引,如果乙個表中已經有乙個聚集索引,那麼這個表中其他的索引都將是非聚集索引。表排列順序 表記錄的排列順序與索引的排...