聚簇索引是一種數據存儲方式,它實際上是在同一個結構中保存了B+樹索引和數據行,InnoDB表是按照聚簇索引組織的(類似於Oracle的索引組織表)。
InnoDB通過主鍵聚簇數據,如果沒有定義主鍵,會選擇一個唯一的非空索引代替,如果沒有這樣的索引,會隱式定義個主鍵作爲聚簇索引。
對於非聚簇索引表來說,表數據和索引是分成存儲的,主鍵索引和二級索引存儲上沒有任何區別。
而對於聚簇索引表來說,表數據是和主鍵一起存儲的,主鍵索引的葉結點存儲行數據,二級索引的葉結點存儲行的主鍵值。
聚簇索引表最大限度地提高了I/O密集型應用的性能,但它也有以下幾個限制:
1)插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁分裂,嚴重影響性能。因此,對於InnoDB表,我們一般都會定義一個自增的ID列爲主鍵。
2)更新主鍵的代價很高,因爲將會導致被更新的行移動。因此,對於InnoDB表,我們一般定義主鍵爲不可更新。
3)二級索引訪問需要兩次索引查找,第一次找到主鍵值,第二次根據主鍵值找到行數據。
二級索引的葉節點存儲的是主鍵值,而不是行指針(非聚簇索引存儲的是指針或者說是地址),這是爲了減少當出現行移動或數據頁分裂時二級索引的維護工作,但會讓二級索引佔用更多的空間。