在MySQL的InnoDB存儲(chǔ)引擎中,聚簇索引和非聚簇索引是兩種主要的索引類型。它們之間有什么相同點(diǎn)和區(qū)別?
1. 聚簇索引
聚簇索引(Clustered Index)是指表中的主鍵,它決定了表中數(shù)據(jù)的物理存儲(chǔ)順序。在 InnoDB 中,表的主鍵默認(rèn)就是聚簇索引。如果沒有顯式定義主鍵,InnoDB 會(huì)選擇一個(gè)唯一的非空索引作為聚簇索引;如果沒有任何合適的索引,InnoDB 會(huì)隱式創(chuàng)建一個(gè)行ID作為聚簇索引。
聚簇索引使用 B+ 樹結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。樹的葉子節(jié)點(diǎn)直接存儲(chǔ)完整的行數(shù)據(jù)。因此,聚簇索引既是索引又是數(shù)據(jù)存儲(chǔ)的一部分。
聚簇索引的特點(diǎn):
唯一性:每個(gè)表只能有一個(gè)聚簇索引,因?yàn)閿?shù)據(jù)行只能按照一種順序存儲(chǔ)。
訪問效率:對(duì)于基于聚簇索引的范圍查詢,性能較高,因?yàn)橄嚓P(guān)數(shù)據(jù)物理上是連續(xù)存儲(chǔ)的。
維護(hù)成本:插入、更新或刪除操作可能需要重新組織數(shù)據(jù)頁,成本較高,尤其是當(dāng)插入位置不在表尾時(shí)。
2. 非聚簇索引
非聚簇索引(Non-Clustered Index)是指除聚簇索引之外的所有索引。在 InnoDB 中,非聚簇索引的葉子節(jié)點(diǎn)不存儲(chǔ)完整的行數(shù)據(jù),而是存儲(chǔ)聚簇索引的主鍵值作為指向?qū)嶋H數(shù)據(jù)的引用。
非聚簇索引同樣使用 B+ 樹結(jié)構(gòu),但葉子節(jié)點(diǎn)只包含索引字段和對(duì)應(yīng)的主鍵值。通過主鍵值,進(jìn)一步查找聚簇索引以獲取完整行數(shù)據(jù)。
非聚簇索引的特點(diǎn):
多索引支持:一個(gè)表可以有多個(gè)非聚簇索引,以支持多種查詢條件。
訪問路徑:首先通過非聚簇索引定位到主鍵,然后通過主鍵查詢聚簇索引獲取完整數(shù)據(jù)。這可能涉及兩次查找(索引查找 + 聚簇查找)。
維護(hù)成本:非聚簇索引需要維護(hù)額外的索引結(jié)構(gòu),插入、更新或刪除操作時(shí)需要同時(shí)更新這些索引,增加了維護(hù)成本。