聚簇索引和非聚簇索引

聚簇索引是一種數據存儲方式,它實際上是在同一個結構中保存了B+樹索引和數據行,InnoDB表是按照聚簇索引組織的(類似於Oracle的索引組織表)。

InnoDB通過主鍵聚簇數據,如果沒有定義主鍵,會選擇一個唯一的非空索引代替,如果沒有這樣的索引,會隱式定義個主鍵作爲聚簇索引。


對於非聚簇索引表來說,表數據和索引是分成存儲的,主鍵索引和二級索引存儲上沒有任何區別。

而對於聚簇索引表來說,表數據是和主鍵一起存儲的,主鍵索引的葉結點存儲行數據二級索引的葉結點存儲行的主鍵值

聚簇索引表最大限度地提高了I/O密集型應用的性能,但它也有以下幾個限制:

1)插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁分裂,嚴重影響性能。因此,對於InnoDB表,我們一般都會定義一個自增的ID列爲主鍵。

2)更新主鍵的代價很高,因爲將會導致被更新的行移動。因此,對於InnoDB表,我們一般定義主鍵爲不可更新。

3)二級索引訪問需要兩次索引查找,第一次找到主鍵值,第二次根據主鍵值找到行數據

二級索引的葉節點存儲的是主鍵值,而不是行指針(非聚簇索引存儲的是指針或者說是地址),這是爲了減少當出現行移動或數據頁分裂時二級索引的維護工作,但會讓二級索引佔用更多的空間。


聚簇索引的葉節點就是數據節點非聚簇索引的頁節點仍然是索引檢點,並保留一個鏈接指向對應數據塊
聚簇索引主鍵的插入速度要比非聚簇索引主鍵的插入速度慢很多。
相比之下,聚簇索引適合排序非聚簇索引不適合用在排序的場合因爲聚簇索引本身已經是按照物理順序放置的,排序很快。非聚簇索引則沒有按序存放,需要額外消耗資源來排序
當你需要取出一定範圍內的數據時,用聚簇索引也比用非聚簇索引好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章