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