聚簇索引
- 聚簇索引并不是一種單獨的索引類型,而是一種數(shù)據(jù)存儲方式。
MySQL數(shù)據(jù)庫中innodb存儲引擎,B+樹索引可以分為聚簇索引(也稱聚集索引,clustered index)和輔助索引(有時也稱非聚簇索引或二級索引,secondary index,non-clustered index)。 - 這兩種索引內(nèi)部都是B+樹,聚集索引的葉子節(jié)點存放著一整行的數(shù)據(jù)。
- Innodb中的主鍵索引是一種聚簇索引,非聚簇索引都是輔助索引,像復(fù)合索引、前綴索引、唯一索引。
- Innodb使用的是聚簇索引,MyISam使用的是非聚簇索引
- 聚簇索引(聚集索引)
聚簇索引就是按照每張表的主鍵構(gòu)造一顆B+樹,同時葉子節(jié)點中存放的就是整張表的行記錄數(shù)據(jù),也將聚集索引的葉子節(jié)點稱為數(shù)據(jù)頁。這個特性決定了索引組織表中數(shù)據(jù)也是索引的一部分,每張表只能擁有一個聚簇索引。 - Innodb通過主鍵聚集數(shù)據(jù),如果沒有定義主鍵,innodb會選擇非空的唯一索引代替。如果沒有這樣的索引,innodb會隱式的定義一個主鍵來作為聚簇索引。
聚簇索引的優(yōu)缺點
優(yōu)點:
1.數(shù)據(jù)訪問更快,因為聚簇索引將索引和數(shù)據(jù)保存在同一個B+樹中,因此從聚簇索引中獲取數(shù)據(jù)比非聚簇索引更快
2.聚簇索引對于主鍵的排序查找和范圍查找速度非常快
缺點:
1.插入速度嚴重依賴于插入順序,按照主鍵的順序插入是最快的方式,否則將會出現(xiàn)頁分裂,嚴重影響性能。因此,對于InnoDB表,我們一般都會定義一個自增的ID列為主鍵
2.更新主鍵的代價很高,因為將會導致被更新的行移動。因此,對于InnoDB表,我們一般定義主鍵為不可更新。
3.二級索引訪問需要兩次索引查找,第一次找到主鍵值,第二次根據(jù)主鍵值找到行數(shù)據(jù)。輔助索引+回表
輔助索引(非聚簇索引)
在聚簇索引之上創(chuàng)建的索引稱之為輔助索引,輔助索引訪問數(shù)據(jù)總是需要二次查找。輔助索引葉子節(jié)點存儲的不再是行的物理位置,而是主鍵值。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到數(shù)據(jù)行的數(shù)據(jù)頁,再通過數(shù)據(jù)頁中的Page Directory找到數(shù)據(jù)行。
Innodb輔助索引的葉子節(jié)點并不包含行記錄的全部數(shù)據(jù),葉子節(jié)點除了包含鍵值外,還包含了相應(yīng)行數(shù)據(jù)的聚簇索引鍵。
輔助索引的存在不影響數(shù)據(jù)在聚簇索引中的組織,所以一張表可以有多個輔助索引。在innodb中有時也稱輔助索引為二級索引。