一次搞懂MySQL(所有)索引及其區別

xuxh120發表於2022-03-09

索引的概念介紹

 

1、聚集索引

聚集索引:指索引項的排序方式和表中資料記錄排序方式一致的索引 
也就是說聚集索引的順序就是資料的物理儲存順序。它會根據聚集索引鍵的順序來儲存表中的資料,即對錶的資料按索引鍵的順序進行排序,然後重新儲存到磁碟上。因為資料在物理存放時只能有一種排列方式,所以一個表只能有一個聚集索引。
一次搞懂MySQL(所有)索引及其區別
比如字典中,用‘拼音’查漢字,就是聚集索引。因為正文中字都是按照拼音排序的。而用‘偏旁部首’查漢字,就是非聚集索引,因為正文中的字並不是按照偏旁部首排序的,我們通過檢字表得到正文中的字在索引中的對映,然後通過對映找到所需要的字。
聚集索引的使用場合為: 
  a.查詢命令的回傳結果是以該欄位為排序依據的; 
  b.查詢的結果返回一個區間的值; 
  c.查詢的結果返回某值相同的大量結果集。 
聚集索引會降低 insert,和update操作的效能,所以,是否使用聚集索引要全面衡量。 
 

2、非聚集索引

非聚集索引:索引順序與物理儲存順序不同
一次搞懂MySQL(所有)索引及其區別
非聚集索引的使用場合為: 
  a.查詢所獲資料量較少時; 
  b.某欄位中的資料的唯一性比較高時;
非聚集索引必須是稠密索引
 

3、聚簇索引

聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。術語“聚族”表示資料行和相鄰的鍵值緊湊的儲存在一起。因為無法同時把資料行放在兩個不同的地方,所以一個表只能有一個聚族索引。 
一次搞懂MySQL(所有)索引及其區別
聚族索引的優點 
可以把相關資料儲存在一起。就好像在操場上戰隊,一個院系一個院系的站在一起,這樣要找到一個人,就先找到他的院系,然後在他的院系裡找到他就行了,而不是把學校裡的所有人都遍歷一遍
資料訪問更快。聚族索引將索引和資料儲存在同一個B-Tree中,因此從聚族索引中獲取資料通常比在非聚族索引中查詢更快
 

4、稠密索引

稠密索引:每個索引鍵值都對應有一個索引項
一次搞懂MySQL(所有)索引及其區別
稠密索引能夠比稀疏索引更快的定位一條記錄。但是,稀疏索引相比於稠密索引的優點是:它所佔空間更小,且插入和刪除時的維護開銷也小。
 
5、稀疏索引
稀疏索引:相對於稠密索引,稀疏索引只為某些搜尋碼值建立索引記錄;在搜尋時,找到其最大的搜尋碼值小於或等於所查詢記錄的搜尋碼值的索引項,然後從該記錄開始向後順序查詢直到找到為止。 
一次搞懂MySQL(所有)索引及其區別
 

5、覆蓋索引

如果一個索引包含(或覆蓋)所有查詢需要的欄位的值,就成為覆蓋索引。覆蓋索引只需要掃描索引,不需要回表查詢,能極大的提升效能。

有幾點好處:
1.極大的減少資料訪問量。
2.索引按照列值順序儲存,io密集型的範圍查詢比隨機磁碟IO讀取小的多。
3.由於InnoDB的聚簇索引,覆蓋索引對InnoDB表特別有用。

注:當使用覆蓋索引時,從的EXPLAIN 的extra列可以看到“Using index”的資訊。

 

擴充套件:

mysql常見的兩種的基於B+樹的儲存方式,一種是InnoDB,一種是MyISAM。雖然都是基於B+樹的儲存方式,但是也有點不同。
 
MyIsam 索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的地址。主索引和輔助索引沒有區別都是非聚集索引。索引頁正常大小為1024位元組,索引頁存放在.MYI 檔案中。MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址。
 
InnoDB 也使用B+Tree作為索引結構,索引頁大小16,和表資料頁共同存放在表空間中。從InnoDB表資料存放方式可看出InnoDB表資料檔案本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。
 
InnoDB預設對主鍵建立聚簇索引。如果你不指定主鍵,InnoDB會用一個具有唯一且非空值的索引來代替。如果不存在這樣的索引,InnoDB會定義一個隱藏的主鍵,然後對其建立聚簇索引。一般來說,InnoDB 會以聚簇索引的形式來儲存實際的資料,它是其它二級索引的基礎。
 
所以mysql innodb引擎的聚集索引、聚簇索引都預設是主鍵索引,如果沒有指定主鍵,就是一個具有唯一且非空值的索引,如果不存在這樣的索引,就是InnoDB自定義的隱藏主鍵索引,並且該索引是稠密索引。

相關文章