關于聚簇索引和非聚簇索引的概念很多同學找了很多教程但是仍然很迷糊。
這裡給出一篇翻譯,并給出我的配圖,希望對大家了解有幫助。
英文原文:
http://www.mysqltutorial.org/mysql-index/mysql-clustered-index/一、聚簇索引的概念
一般來說索引就是如B-樹這類可以來存儲鍵值友善快速查找的資料結構。
聚簇索引是實體索引,資料表就是按順序存儲的,實體上是連續的。
一旦建立了聚簇索引,表中的所有列都根據構造聚簇索引的關鍵列來存儲。
(我的了解,所有的記錄行都根據聚簇索引順序存儲,如按照主鍵Id遞增方式依次實體順序存儲)
因為聚簇索引是按該列的排序存儲的,是以一個表隻能有一個聚簇索引。
二、MySQL中InnoDB表的聚簇索引
每個InnoDB表都需要一個聚簇索引。該聚簇索引可以幫助表優化增删改查操作。
如果你為表定義了一個主鍵,MySQL将使用主鍵作為聚簇索引。
如果你不為表指定一個主鍵,MySQL講索第一個組成列都not null的唯一索引作為聚簇索引。
如果InnoBD表沒有主鍵且沒有适合的唯一索引(沒有構成該唯一索引的所有列都NOT NULL),MySQL将自動建立一個隐藏的名字為“GEN_CLUST_INDEX ”的聚簇索引。
是以每個InnoDB表都有且僅有一個聚簇索引。
所有不是聚簇索引的索引都叫非聚簇索引或者輔助索引。
在InnDB存儲引擎中,每個輔助索引的每條記錄都包含主鍵,也包含非聚簇索引指定的列。
MySQL使用這個主鍵值來檢索局促索引。
是以應該盡可能将主鍵縮短,否則輔助索引占用空間會更大。
一般來說用自增的整數型列作為主鍵列。
-----------------------華麗分隔符-------------------
簡單解釋
聚簇索引和非聚簇索引
下面舉例聚簇索引和非聚簇索引的差別。
注意:這裡的主鍵是非自增的。普通索引K表示普通的索引非唯一索引。
主鍵是采用B+Tree的資料結構(請看左圖),根據上文可以知主鍵為聚簇索引,實體存儲是根據ID的增加排序遞增連續存儲的。
普通索引K也是B+Tree的資料結構(請看右圖),但是它不是聚簇索引,是以為非聚簇索引或者輔助索引(聚簇索引隻可能是主鍵,或者所有組成唯一鍵的所有列都為NOT NULL的第一個唯一索引,或者隐式建立的聚簇索引這三種情況)。
他的葉子節點存儲的是索引列的值,它的資料域是聚簇索引即ID。
假如普通索引k為非唯一索引,要查詢k=3的資料。
需要在k索引查找k=3得到id=30。
然後在左側的ID索引樹查找ID=30對應的記錄R3。
然後K索引樹繼續向右查找,發現下一個是k=5不滿足(非唯一索引後面有可能有相等的值,是以向右查找到第一個不等于3的地方),停止。
整個過程從K索引樹到主鍵索引樹的過程叫做“回表”。
更多進階内容參考極客時間《MySQL45講》
創作不易,如果覺得本文對你有幫助,歡迎點贊,歡迎關注我,如果有補充歡迎評論交流,我将努力創作更多更好的文章。
————————————————
版權聲明:本文為CSDN部落客「明明如月學長」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:
https://blog.csdn.net/w605283073/article/details/95255618